2010-07-30 62 views
1

我使用Asp.net,.net 3.5,win2003,iis 6.0。使用BZip2(SharpZipLib)的OutOfMemoryException

我使用Oracle收集文件,在表Oracle中的字段RAW中以SharpZipLib.BZip2壓縮格式保存文件。

我的應用程序是Web,我使用WCF服務來獲取文件的數據(字節數組)。 aspx頁面將文件發送給用戶(下載文件)。

我的問題,問題:

我從Oracle讀取數據,(我打電話WCF服務)。我得到的字節數組(byte []),

我嘗試解壓縮文件使用SharpZipLib.BZip2

using (MemoryStream inData = new MemoryStream(data)) 
{ 
using (MemoryStream outData = new MemoryStream()) 
{ 
      BZip2.Decompress(inData, outData); //<==================== Fails here OutOfMemoryException 
      return outData.ToArray(); 
} 

} 

錯誤是因爲文件 「解壓縮」 是大,非常大(> 500 MB)! !

壓縮文件:4MB

解壓縮文件:> 500 MB

我做的測試是這樣的:

BufferedStream bufin = new BufferedStream(instream); 

      using (MemoryStream outData = new MemoryStream()) 
      { 
       BZip2.Decompress(bufin, outData); 

       return outData.ToArray(); 
      } 

但我得到同樣的OutOfMemoryException異常

跟蹤堆棧

en System.IO.MemoryStream.set_Capacity(Int32 value) 
    en System.IO.MemoryStream.EnsureCapacity(Int32 value) 
    en System.IO.MemoryStream.WriteByte(Byte value) 
    en Reale.Frk.Compression.BZip2.BZip2.Decompress(Stream inStream, Stream outStream) 

SharpZipLib.BZip2.Decompress

public static void Decompress(Stream inStream, Stream outStream) 

      { 

        if (inStream == null) { 

         throw new ArgumentNullException("inStream"); 

        } 

        if (outStream == null) { 

         throw new ArgumentNullException("outStream"); 

        } 


        using (outStream) { 

         using (BZip2InputStream bzis = new BZip2InputStream(inStream)) { 

          int ch = bzis.ReadByte(); 

          while (ch != -1) { 

            outStream.WriteByte((byte)ch); 

            ch = bzis.ReadByte(); 

          } 

         } 

        } 

      } 

任何建議,意見,示例源代碼的代碼?

回答

2

跳過MemoryStream並直接寫入文件。

否則增加更多的內存到服務器。

另一個選項來指定MemoryStream初始容量。

+0

requeriments,我寧願避免寫入文件:(添加更多的服務器內存是不可能的。 – Kiquenet 2010-07-30 09:33:24

+2

那麼你是F * cked。嘗試使用更少的內存密集型的解壓縮算法。如果添加更多的內存是個問題,我懷疑你有辦法更大的問題.... – leppie 2010-07-30 10:05:51

+0

任何其他的解決辦法,好嗎? – Kiquenet 2015-06-30 08:14:05

0

有機會,你得到了內存不足的錯誤,因爲500 MB內存流的單一連續的存儲區不可用您的系統上,但你可以有足夠的非連續的內存塊。改爲使用MemoryTributary類,它可能會工作。類可能需要一些調整(如果我沒有記錯它可能不乾淨返回的最後塊,並用ASCII墊它(0))應用程序的