@@ -16,14 +16,25 @@ public Runner(RunnerConfig config)
1616 this . config = config ;
1717 }
1818
19- public async Task Run ( )
19+ public async Task Run ( )
2020 {
2121 await this . config . File . DownloadIfNotExistsAsync ( ) ;
2222
2323 Console . WriteLine ( "Running..." ) ;
24- int count = 0 ;
24+
2525 var sw = Stopwatch . StartNew ( ) ;
2626
27+ int count = this . config . Analysis . First ( ) . CacheSize >= 1_000_000 ? AnalyzeLarge ( ) : AnalyzeSmall ( ) ;
28+
29+ Console . WriteLine ( $ "Tested { count } keys in { sw . Elapsed } ") ;
30+
31+ this . config . Analysis . WriteToConsole ( ) ;
32+ Analysis < long > . WriteToFile ( this . config . Name , this . config . Analysis ) ;
33+ }
34+
35+ private int AnalyzeSmall ( )
36+ {
37+ int count = 0 ;
2738 foreach ( var key in this . config . File . EnumerateFileData ( ) )
2839 {
2940 foreach ( var a in this . config . Analysis )
@@ -37,10 +48,34 @@ public async Task Run()
3748 }
3849 }
3950
40- Console . WriteLine ( $ "Tested { count } keys in { sw . Elapsed } ") ;
51+ return count ;
52+ }
4153
42- this . config . Analysis . WriteToConsole ( ) ;
43- Analysis < long > . WriteToFile ( this . config . Name , this . config . Analysis ) ;
54+ // for very large cache sizes do multiple passes of the data,
55+ // else not everything can fit in memory.
56+ private int AnalyzeLarge ( )
57+ {
58+ int count = 0 ;
59+
60+ foreach ( var a in this . config . Analysis )
61+ {
62+ Console . WriteLine ( $ "Analyzing cache size { a . CacheSize } ") ;
63+
64+ foreach ( var key in this . config . File . EnumerateFileData ( ) )
65+ {
66+ a . TestKey ( key ) ;
67+
68+ if ( ++ count % 100000 == 0 )
69+ {
70+ Console . WriteLine ( $ "Processed { count } keys...") ;
71+ GC . Collect ( ) ;
72+ }
73+ }
74+
75+ GC . Collect ( 2 , GCCollectionMode . Forced , true ) ;
76+ }
77+
78+ return count ;
4479 }
4580 }
4681}
0 commit comments