3

私のアプリケーションでは、大きなファイル(約250 MB)をメモリにロードする必要があります。ユーザーがファイルを表示するように要求したときに、怠惰な方法でロードしています。その後、ユーザーがファイルにアクセスしようとするたびに、ファイルはすでにメモリにあるため、すぐに表示できます。したがって、問題はガベージコレクションにあります...ロードするすべてのファイル、WeakReferenceを介してロードしていますが、テストしました。数回テストしましたが、約3GBをメモリにロードできました(アプリが使用できなくなるよりも) )、しかしGCは発生しませんでした。GC.Collect(2)を呼び出すことができないのは、呼び出す時間を決定できないためです。そのため、GCに適切なタイミングでメモリ(弱参照)を収集するように指示する方法(くそー、3GBが多すぎる... GCは彼の仕事をしていません)それを解決するのは暑いですか?本当に遅延読み込みが必要です、

4

1 に答える 1

1

GC.GetTotalMemory(bool forceFullCollection)http://msdn.microsoft.com/en-us/library/system.gc.gettotalmemory.aspx )と呼ばれる静的関数があります。しきい値を超えた場合は、これを使用して、新しいファイルをメモリにロードする前にガベージコレクションを強制することができます。

編集:可能な実装

public MyFile GetMyFile(){
   if ( !is_my_file_in_memory() ) {
      if (CG.GetTotalMemory(false) > MY_THRESHOLD ) {

        GC.Collect(2);

      }
      load_my_file_in_memory();
   }
   return get_my_file_from_memory();
}
于 2011-03-01T16:48:02.637 に答える