0

MemoryStream に読み込み、FileStreamResult として返す大きな zip ファイル (500MB 以上) があります。ただし、200MB を超えるファイルに対して OutOfMemory Exception が発生します。私のアクション内には、次のコードがあります。

MemoryStream outputStream = new MemoryStream();
using (var fs = new FileStream(filepath, FileMode.Open, FileAccess.Read))
{
   //Response.BufferOutput = false;   // to prevent buffering
   byte[] buffer = new byte[1024];
   int bytesRead = 0;
   while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0)
   {
      outputStream.Write(buffer, 0, bytesRead);
   }
}

outputStream.Seek(0, SeekOrigin.Begin);
return new FileStreamResult(outputStream, content_type);
4

2 に答える 2

2

このページで提案されている解決策を試すことができます。

ファイルストリームを使用して500MBの大きなファイルを送信するとOutOfMemoryExceptionが発生する

ファイルを に読み込み、IStream応答を送信する方法を示します。

于 2012-04-04T14:38:39.380 に答える
2

ファイルを MemoryStream に読み込む場合でも、ファイル全体にメモリを割り当てる必要があります。これは、内部的には MemoryStream がバイト配列に他ならないためです。

したがって、現在、小さな中間(メモリ内)バッファを使用して、ファイルを大きなメモリバッファに読み込んでいます。

ファイル ストリームを直接 FileStreamResult に転送しないのはなぜですか?

using (var fs = new FileStream(filepath, FileMode.Open, FileAccess.Read))
{
    return new FileStreamResult(fs, content_type); 
}
于 2012-04-04T14:47:56.893 に答える