2014-09-28 76 views
0

我正在讀取一個數據流中的數據並寫入另一個數據流。 我想要複製的文件是1.4 GB的大小。 爲什麼我的程序在讀寫時一直在使用內存。 如何防止內存不足異常?從流寫入到另一個流時讀存儲器超過

//Write data from URL 
HttpWebRequest webRequestWrite = (HttpWebRequest)WebRequest.Create(WriteUrl); 

webRequestWrite.AllowReadStreamBuffering = false; 
webRequestWrite.AllowWriteStreamBuffering = false; 

webRequestWrite.Method = "PUT"; 
using (Stream responseStreamWrite = webRequest.GetRequestStream()) 
{ 

    int chunkSize = 4194304; 
    byte[] buffer = new byte[chunkSize]; 
    int bytesRead = 0; 
    int totalBytes = 0; 

    //Read data from URL 
    HttpWebRequest webRead = (HttpWebRequest)WebRequest.Create(ReadUrl); 
    webRead.AllowReadStreamBuffering = false; 
    webRead.AllowWriteStreamBuffering = false; 
    using (WebResponse webResponseread = webRead.GetResponse()) 
    using (Stream responseStreamRead = webResponseread.GetResponseStream()) 
    { 
     while ((bytesRead = responseStreamRead.Read(buffer, 0, chunkSize)) > 0) 
     { 
     totalBytes += bytesRead; 
     responseStreamWrite.Write(buffer.Take(bytesRead).ToArray(), 0, bytesRead); 
     responseStreamWrite.Flush(); 
     responseStreamRead.Flush(); 
     } 
    } 

    responseStreamWrite.Flush(); 
} 
+0

[在C#中用流讀取大型文本文件]可能的副本(http://stackoverflow.com/questions/2161895/reading-large-text-files-with-streams-in-c-sharp) – prashantsunkari 2014-09-28 00:40:00

+1

Are you獲得OOM異常還是對內存使用不滿?請注意,您應該使用'Stream.CopyTo'或甚至'Stream.CopyToAsync',而不是自行創建。 – 2014-09-28 00:49:28

+0

您可以在'webRequestWrite'請求上將'SendChunked'設置爲true嗎?您可能還需要設置ContentLength。 – 2014-09-28 00:52:52

回答

1

你可以嘗試設置SendChunked爲true,你是寫(webRequestWrite)的請求。否則,請求將在內部進行緩衝,直到請求流關閉,因此整個請求可以作爲單個消息發送。底層資源需要支持這種傳輸模式,可能需要您先設置內容長度。這裏的內部緩衝區不同於AllowWriteStreamBuffering,它們在重定向或認證請求的情況下緩存用於重新發送的數據。

0

嘗試用BufferedStream替換Stream。

http://msdn.microsoft.com/en-us/library/system.io.bufferedstream.read(v=vs.110).aspx 

可能是重複的問題:

Reading large text files with streams in C#

+0

不知道這是如何回答這個問題的:OP根本不能選擇流的類型(來自WebRequest),並且已經以大塊讀取。 – 2014-09-28 00:47:58

+0

你在哪裏看到內存不足的例外。是否在這一步bytesRead = responseStreamRead.Read(buffer,0,chunkSize)? – prashantsunkari 2014-09-28 00:51:29

相關問題