2012-04-04 39 views
0

私はMemoryStreamに読み込んでFileStreamResultとして返す大きなzipファイル(500MB以上)を持っています。しかし、200MB以上のファイルに対してOutOfMemory例外が発生しています。ASP MVC FileStreamResult OutOfMemoryException

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); 
+0

私はReadAllBytesを使用したくないのは、2GBの制限と、ファイル全体を一度にメモリに読み込む際のメモリの問題のためです。 – user327999

答えて

1

は、あなたがこのページで提案された解決策を試みることができる:私の行動の中で、私は次のコードを持っている

OutOfMemoryException when sending a big file 500mb using filestream

それはIStreamにファイルを読み込み、レスポンスを送信する方法を示しています。

+1

これは答えとしてマークする必要があります。リンクは私のために働いた。ありがとう。 – RayLoveless

2

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

現在のところ、(メモリ内の)中間バッファを使用してファイルを大容量のメモリバッファに読み込んでいます。

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

using (var fs = new FileStream(filepath, FileMode.Open, FileAccess.Read)) 
{ 
    return new FileStreamResult(fs, content_type); 
} 
+0

私はこのアプローチを試しているときに別のプロセスによって使用されているため、プロセスはファイルにアクセスできません。 – user327999

+0

申し訳ありませんが、その答えはとても遅く、早く気付かなかった。これは役立つはずです:新しいFileStream(filepath、FileMode.Open、FileAccess.Read、FileShare.Read)。これは、読み取りアクセスである限り、ファイルを複数開くことができます。 – Fionn

+0

これを動作させることができませんでした。使用しているメモリを削除すると、メモリ不足例外が発生します。それが含まれている場合は、私のmvcアプリケーションを使用して、私たちのエラーページにリダイレクトしています...理由はわかりません。 – RayLoveless