ファイルをバイト [] データ パケットのストリームとして受信しています (合計サイズは事前にわかりません)。受信直後に処理する前にどこかに保存する必要があります (その場で処理を行うことはできません)。 )。受信したファイルの合計サイズは、10 KB から 4 GB 以上までさまざまです。
- 受信したデータを格納するための 1 つのオプションは、 を使用すること
MemoryStream
です。つまり、一連のMemoryStream.Write(bufferReceived, 0, count)
呼び出しを使用して、受信したパケットを格納します。これは非常に単純ですが、大きなファイルではメモリ不足の例外が発生することは明らかです。 - 別のオプションは、を使用すること
FileStream
ですFileStream.Write(bufferReceived, 0, count)
。このようにして、メモリ不足の例外は発生しませんが、ディスク書き込みによるパフォーマンスの低下がよくわかりません (十分なメモリがまだ利用可能である限り、これは発生したくありません)。ディスクへのアクセスはできるだけ避けてください。しかし、これを制御する方法がわかりません。
MemoryStream.Write()
私はいくつかのテストを行いましたが、ほとんどの場合、 vsの 10 000 回の連続呼び出しの間にパフォーマンスの違いはほとんどないようですFileStream.Write()
が、多くはバッファサイズと問題のデータの総量 (つまり、書き込み数) に依存しているようです。 . 明らかに、MemoryStream
サイズの再割り当ても要因です。
MemoryStream
との組み合わせを使用することは理にかなっていますか。FileStream
つまり、デフォルトでメモリ ストリームに書き込みますが、受信したデータの合計量が 500 MB を超えると、それをFileStream
;に書き込みます。次に、受信したデータを処理するために両方のストリームからチャンクを読み取ります (最初に から 500 MB を処理しMemoryStream
、破棄してから から読み取りますFileStream
)。もう 1 つの解決策は、内部配列の割り当てに連続したアドレス空間を必要としないカスタム メモリ ストリームの実装 (つまり、メモリ ストリームのリンク リスト) を使用することです。このようにして、少なくとも 64 ビット環境では、メモリ不足の例外が問題になることはなくなります。短所:余分な作業、ミスの余地が増える。
FileStream
では、ディスク アクセスとメモリ キャッシング、つまりデータ サイズとパフォーマンスのバランスに関して、対MemoryStream
読み取り/書き込みはどのように動作するのでしょうか。とにかく、十分なRAMが利用可能である限り、FileStream
メモリ(キャッシュ)から内部的に読み書きし、残りは仮想メモリが処理することを期待しています。FileStream
しかし、書き込み時に明示的にディスクにアクセスする頻度はわかりません。
どんな助けでも大歓迎です。