3

大きなテキストファイルをメモリに読み込んで処理を行う単純なasp.netWebサイトがあります。以下は、OOM例外を発生させるコードです。約350k行を読んだ後、このエラーが発生します。各行の平均文字数は1,000文字です。IISまたはASP.NetWebサイトにメモリ制限はありますか?私のサーバーにはまだ十分な物理メモリが残っています。ありがとう。

List<string> geos = new List<string>();
using (StreamReader geoReader = new StreamReader(File.OpenRead("file.txt")))
{
    while (geoReader.EndOfStream == false)
    {
        try
        {
            geos.Add(geoReader.ReadLine());
        }
        catch (Exception ex) { }
    }
}
4

2 に答える 2

2

ほとんどの場合、ワーカープロセスは32ビット(x86)に構成されています。この場合、少なくとも約2GBの割り当てられたオブジェクトでOOMに到達しますが、ほとんどの場合はもっと早くなります。

本当にメモリに1GBを超えるオブジェクトをロードする必要がある場合は、64ビットプロセスでコードを実行することを検討してください。

注:上記では、実際にメモリが不足していると仮定して、一度に2GB以上の割り当てを実行しようとするようなものではありません。これにより、デフォルトでOOMがスローされます(最新の.Netでは、私が覚えている限り、より大きな割り当てが可能です)。

于 2013-02-18T02:23:01.023 に答える
1

msdnで検索を行ったところ、役立つことがいくつか見つかりました。

考慮すべき点がいくつかあります。まず、「Process \ VirtualBytes」が仮想アドレススペースの制限(通常は2 GB)から600 MB以内にある場合、OutOfMemoryExceptionが発生する可能性が劇的に増加し始めます。次に、テストで次のことが示されています。 「Process\VirtualBytes」は「Process\PrivateBytes」より600MB以下大きいことがよくあります。この違いは、GCによって維持されるMEM_RESERVE領域に一部起因しており、必要に応じてより多くのメモリをすばやくコミットできるようになっています。まとめると、これは、「Process \ PrivateBytes」が800MBを超えると、OutOfMemoryExceptionが発生する可能性が高くなることを意味します。この例では、マシンに4 GBの物理RAMがあるため、メモリ不足状態を回避するために、メモリ制限を20%に設定する必要があります。これらの数値を試して、マシンのメモリ使用量を最大化することもできますが、安全にプレイしたい場合は、例の数値が機能します。要約すると、メモリ制限を物理RAMの60%または800MBの小さい方に設定します。v1.1は3GBの仮想アドレス空間をサポートしているため、boot.iniに/ 3GBを追加すると、上限として800MBではなく1,800MBを安全に使用できます。

http://msdn.microsoft.com/en-us/library/ms972959

もう1つの考えられる原因は、Service Pack 1 for .NETFramework1.1がインストールされていないことです。サービスパックをインストールしないと、メモリの例外が発生する可能性が高くなると思います。

于 2013-02-18T03:18:18.180 に答える