4

ユーザー提供のファイルを処理する必要があるメソッドがあり、ファイルが十分に複雑な場合、OutOfMemoryException. これらの場合、メソッドが失敗しても問題ありませんが、アプリケーションを引き続き使用できるようにしたいのですが、問題は、OutOfMemoryExceptionアクションのすべてのコースがメモリを消費するため、取得した後は何もできないことです.

例外がスローされたら解放できるメモリを確保して、アプリケーションの残りの部分を続行できるようにすることを考えましたが、オプティマイザがこの割り当てを削除するようです。

public void DoStuff(string param)
{
    try
    {
#pragma warning disable 219
        var waste = new byte[1024 * 1024 * 100]; // set aside 100 MB
#pragma warning restore 219

        DoStuffImpl(param);
    }
    catch (OutOfMemoryException)
    {
        GC.Collect(); // Now `waste` is collectable, prompt the GC to collect it
        throw; // re-throw OOM for treatment further up
    }
}

簡単に言えば、私の質問は次のとおりです。

  1. 私が試みていることを行うためのより良い方法はありますか?
  2. そうでない場合、これが悪い考えである正当な理由はありますか?
  3. wasteこのアイデアが進むべき道であると仮定すると、JIT がd メモリを最適化しないように強制するにはどうすればよいですか?
4

2 に答える 2

1

ユーザー提供のファイルの場合は、処理する前にファイルのサイズを確認できます。

FileInfo f = new FileInfo(fileName);
long s1 = f.Length;

この SO スレッドでは、32 ビット .NET アプリケーションのメモリ制限について説明しています。 32 ビット .NET プロセスで 1,000 MB を超えるメモリを割り当てる

ファイルのサイズとアプリケーションが既に消費しているメモリの量を知ることは、処理を試みる前にリソースをクリーンアップする必要があるかどうか、または処理できるかどうかを確認するのに役立ちます。

于 2015-03-15T15:24:56.037 に答える