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