0

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 に通知する必要がありますか?

ありがとうございました!

4

1 に答える 1