2

私が割り当てていた金額が間違っていたので、これは議論の余地のある質問です. 400GB ではなく 400MB のはずだったのに… ごめんなさい!しかし、答えは良いです。

大きなファイルがアップロードされた場合に OutOfMemoryException をスローするメソッドを単体テストしようとしています。

私の問題は、単体テストでもこの例外がスローされていることです (同じ理由で推測します)。

タスク マネージャーによると、情報を正しく読み取っていれば十分な RAM があるため、単体テストがこのように失敗する理由がよくわかりません。

RAM 使用量

それぞれの単体テスト コードは次のとおりです。

var data = new List<byte>();
for(UInt64 i = 0; i < 400ul * 1024ul * 1024ul * 1024ul; i += 65536ul)
{
    data.AddRange(new byte[65536]); // <-- throws exception here when i = 536870912
}
this.UploadedFileData = data.ToArray();

上記のコードの前に、次のことを試しました。

var data = new byte[400ul * 1024ul * 1024ul * 1024ul];

ただし、これによりエラーが発生します。算術演算でオーバーフローが発生しました。

4

2 に答える 2

4

32ビットマシンを使用していますか?

/3GB ブート スイッチを使用しない限り、プロセスの制限は 32 ビットで 2GB です。

C#からヒープサイズを増やす - 可能ですか

以下を行う必要がある可能性があります

非常に大きな List オブジェクトの場合、ランタイム環境で gcAllowVeryLargeObjects 構成要素の enabled 属性を true に設定することにより、64 ビット システムで最大容量を 20 億要素に増やすことができます。

http://msdn.microsoft.com/en-us/library/6sh2ey19.aspxから

David が言及しているように、コードが大きくなると、多くの再割り当てが必要になります。パフォーマンス コストとメモリの断片化を防ぐには、コードを書き直さなくても、少なくともCapacity適切な量に設定する必要があります。

于 2013-01-11T06:20:11.927 に答える
1

ほとんどの場合、最大割り当てサイズの制限 (ほとんどのバージョンで 2GB) に達しており、何かをスローする必要があります。OOM はそのために最適です。

制限についてはこちらで説明しています: CLR 4.0 では、単一オブジェクトのサイズはまだ 2 GB に制限されていますか?

補足:メモリの連続ブロックに基になるデータを格納する必要があるため、ゆっくりと巨大なサイズに拡張したい場合はMemoryStream、 andは悪い選択です。List必要な量のストレージを事前に割り当てるか、カスタムのチャンク ストリーム/リストを使用します。

4.5 より前の CLR で約 2Gb の割り当て制限を取得する配列のサンプル - http://blogs.msdn.com/b/joshwil/archive/2005/08/10/450202.aspx

于 2013-01-11T06:31:34.537 に答える