1 GB のメモリを使用する必要がある C# のプログラムがあります。ただし、追加の RAM を必要とするアダプター コードを使用しています。実行時に 400MB 以上を割り当てることができないようです。
最適化の正しい方向を教えてもらえますか?
private static void FillHashTable()
{
precomputed = new Hashtable( (Int32)( 50 * 1000000 ) );
var htFileNames = Directory.EnumerateFiles( "precomputed_bin" );
var input = new Byte[40000000]; // 40MB
var decoded = new UInt32[input.Length/4]; // 40MB
foreach ( var htFileName in htFileNames )
{
try
{
hStream = new FileStream( htFileName, FileMode.Open );
}
catch ( Exception e )
{
if ( hStream == null )
return;
hStream.Close();
Console.WriteLine( e.ToString() );
return;
}
var br = new BinaryReader( hStream );
input = br.ReadBytes( (int)hStream.Length );
Buffer.BlockCopy( input, 0, decoded, 0, input.Length );
foreach ( var n in decoded )
precomputed.Add( n.GetHashCode(), n ); // 40MB per iter
// close
br.Close();
br.Dispose();
decoded = null;
hStream.Close();
hStream = null;
GC.Collect();
}
SerializeHashtable();
}
これまでのところ、データの 40% しかロードできず、すべてを RAM に保存する必要があります。
ガベージ コレクションの不確定な時間を回避するために C++ を使用する必要がありますか? (今のところ私のトップオプション)
または、入力をチャンクに分割して再利用し、オーバーヘッドを回避する必要がありますか?
リソースを正しく解放していないか、GC が失敗していますか?
1GB 以上が必要であることを OS に通知する必要がありますか?
ありがとうございました!