進捗報告のある大きな(実際には数ギガバイトまで)大きなファイルのアップロードをサポートするために、hereのようにPushStreamContentでHttpClientを使用しました。 (TransferEncodingChunkedが設定されていないと、HttpClientがOutOfMemory例外をスローする
private void PushContent(Stream src, Stream dest, int length)
{
const int bufferLength = 1024*1024*10;
var buffer = new byte[bufferLength];
var pos = 0;
while (pos < length)
{
var bytes = Math.Min(bufferLength, length - pos);
src.Read(buffer, 0, bytes);
dest.Write(buffer, 0, bytes);
pos += bufferLength;
dest.Flush();
Console.WriteLine($"Transferred {pos} bytes");
}
dest.Close();
}
しかし、最初に、このコードは、プロセスのメモリ消費量が非常に高くなかったにもかかわらず、320メガバイトを転送した後のOutOfMemory例外が発生しました:それは、私たちは二つの流れの間にバイトをコピーし、簡単な作品ここでのコード例であります約500MB)。だけでなく、私たちは、このフラグを設定して、巨大なファイルを転送することができました、メモリ消費量が90%減少し
request.Headers.TransferEncodingChunked = true;
:何、この問題を修正することはTransferEncodingChunkedフラグを設定しています。
TransferEncodingChunkedの使用を必要とするドキュメントが見つかりませんでした。これは試行錯誤のプロセスですが、このシナリオでは非常に重要です。それでも私は例外が全くスローされない理由に困惑しています - メモリ消費量はそれほど高くなく、原因は何ですか?
データが大きい場合は、それをチャンクで送信する方がよいでしょう、それは驚くべきことですか? – demonplus
私はOutOfMemoryの驚くべき例外を早期に発見しました。 –