質問

い10のスレッドが書き数千の小さなバッファ(16-30バイト)に巨大なファイルをランダムな位置で一部のスレッドがスロー OutOfMemoryExceptionにFileStream.Write()opreation.

どの原因となOutOfMemoryException?どうですか?

私が使っているのFileStreamこのような(毎の記述項目-このコードから10の異なるスレッド):

using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite, BigBufferSizeInBytes, FileOptions.SequentialScan))
{
 ...
 fs.Write();
}

いすべてのバッファを割り当てのFileStreamんの発売時期によります。何かわからないか、CLRではなく、投げな走GCサイクルと無料の未利用バッファ?

正しい解決策はありません

他のヒント

あなたのコードが示すように10件のスレッドがファイルを開いている場合は、いずれかの時点で10個のundisposedのFileStreamオブジェクトの最大を持っています。はい、FileStreamをはの の内部バッファ、あなたのコードで「BigBufferSizeInBytes」と指定するの大きさを持っています。あなたは、正確な値を開示していただけますか?これは十分な大きさである場合(例えば〜100メガバイト)、それはよく、問題の原因となる可能性があります。

デフォルト(すなわち、あなたは建設時に番号を指定しない場合)することにより、このバッファは4kBのであり、それは、ほとんどのアプリケーションのために、通常は大丈夫です。あなたが本当にディスク書き込みのパフォーマンスを心配している場合、一般的に、あなたはより多くの100KBのカップルにこの1を増加させたがいない可能性があります。

あなたが(処分前にバッファが)FileStreamオブジェクトを使用すると、それに書き込む16-30バイト以上が含まれることはありません言ったようです。

しかし、特定のアプリケーションがそうするために、あまり意味がありません

あなたの質問に答えるために、OutOfMemoryException例外は、のGCが実行された後、要求されたメモリは、を割り当てることができない場合にのみ、スローされます。バッファは本当に大きい場合は、再度、システムはだけではないの連続したのチャンク、左のメモリをたくさん持つことができます。ラージオブジェクトヒープが圧縮されることはありませんので、これはです。

私たちはこの数倍もの 大ヒープオブジェクト スローされる可能性がありますが例外なsubtially、一見すpleanty利用可能なメモリまたはアプリケーションを起動OK。

思いこの問題は高頻度がほぼexactallyうdiscribingます。

必要なもの。的なヘルプオーサリング-ツールこれらの疑問に答えます。しかし、私の推測では、関連する潜在的なハロウィンの問題 (ギDooky) .

ごバッファについても書いてください。からの読み出し可能の問題も大きなオブジェクトのヒープ関係)も、必要なものをお付けについて詳しいあります。私は釘付けの最後のバグっとほぼ同じ(しを行っております多くの並列ハッシュの更新、すべての要求独立した状態を維持する全体の入力ファイル....

OOP!直スクロールに渡していない"BigBufferSizeInBytes"いぶ大型のオブジェクトのヒープとして名高い大衆居酒屋"岸田屋

また、(これは非常に難しいことな不足によるコンテキストサービスで小さな派遣"mbuf"、コピーを行うグループの全てのdisperateスレッドを個別に読み全体に大型のバッキング配列...(できない原因insadential配分の非常にsubtileコードの構文).

バッファは、一般のFileStream内部割り当てられていません。おそらく問題は、「小さなバッファの何千もの書き込み」行がある - あなたは本当にそれを意味するのですか?通常は、多くのバッファを再使用し、何度も何度(すなわち、異なる呼び出しでは、読み取り/書き込みに)。

また、 - これは、単一のファイルですか?単一のFileStreamは、スレッドセーフであるとは限り...ので、あなたが同期を行っていない場合は、混乱を期待されていません。

これは、これらの制限は、基礎となるOSから生じ、および.NET Frameworkは制限のこれらの種類を克服するために無力であるということが可能です。

私はあなたのコードサンプルから推測することはできませんすることは、同時にこれらのFileStreamオブジェクトの多くを開く、または順番に本当に速いそれらを開くかどうかです。 「を使用して」キーワードの使用は、ファイルがfs.Write()呼び出しの後に閉じていることを確認します。ファイルを閉じるために必要な一切GCサイクルはありません。

FileStreamクラスは、実際にファイルへのシーケンシャルな読み取り/書き込みアクセスを目指しています。あなたはすぐに大きなファイルにランダムな場所に記述する必要がある場合は、仮想ファイルマッピングを使用して見てみることをお勧めします。

更新:それは仮想ファイルマッピングが正式に4.0まで、.NETでサポートされないようです。あなたは、この機能のためのサードパーティの実装を見てみたいことがあります。

デーブ

あなたがあなたの問題の根本を釘付け場合は、

私は似たような経験と疑問に思ったんだ?

私のコードが異なるバイトのファイル間のかなりの数メガバイトを渡し、ファイル間のコピーのかなり多くを行います。私のプロセスによって使用されているよりもはるかに - 私は、プロセスのメモリ使用量は、合理的な範囲内に留まる一方で、システムメモリの割り当ては、コピー中にあまりにも高まで撃つことに気付きました。

私はFileStream.Write()の呼び出しまで問題を追跡してきました - この行が取り出され、メモリ使用量が予想通りに行くようです。マイBigBufferSizeInBytesデフォルト(4K)であり、これらは

...集めることができたところ私はどこでも見ることができません

あなたはあなたの問題を見ながら発見したものはありがたく受け取ったことでしょう!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top