2009-03-31 6 views
1

レスポンスストリームにpdfファイルを返すhttprequestを呼び出しています。これは小さいpdfでもうまくいきますが、ファイルが25-30MBくらい上がっているわけではなく、メモリ不足の例外が返されています。ResponseStreamからメモリストリームを作成するメモリ不足例外

 MemoryStream memStream = new MemoryStream(); 
     byte[] buffer = new byte[2048]; 

     int bytesRead = 0; 
     do 
     { 
      bytesRead = _ResponseStream.Read(buffer, 0, buffer.Length); 
      memStream.Write(buffer, 0, bytesRead); 
     } while (bytesRead != 0); 

     _ResponseStream.Close(); 
     _ResponseStream.Dispose(); 
     _ResponseStream = null; 

     if (memStream.Length > 0) 
      return memStream; 
     else return null; 

マシンスペックは、クアッドコア3.0GZ、4GB RAM(物理ボックス)です。 PDFが60MBのサイズに達する可能性があります。複数のユーザーが同時にダウンロードできます。これはどのように影響しますか?レスポンスストリームをFileStreamに直接送信する方が良いでしょうか?これを行うベストプラクティスの方法はありますか?

答えて

-1

ある時点でメモリストリームのメモリが不足しているようです。ファイルが最終的にファイルシステムに保存されると、元のストリームをhttpwebrequestから取得し、そのままファイルに保存します。

2

MemoryStreamの場合、60MBの容量が問題ありません。容量は必要なときに倍増するので、約120MBのバッキングアレイがあるかもしれませんが、まともなマシンを壊すことはありません。

入力データがそれより大きくないと確信していますか?どのくらいの記憶がありますか?最初にレスポンスストリームのサイズを調べることはできますか?適切な容量のMemoryStreamを作成することができれば、それは役に立ちます。

0128,ステートメントは、応答ストリームの処理(CloseとDisposeの呼び出し)に適しており、変数をnullに設定することは過剰です。