使用BZip2(SharpZipLib)的OutOfMemoryException

时间:2010-07-30 09:18:32

标签: .net stream bytearray out-of-memory sharpziplib

我使用Asp.net,.net 3.5,win2003,iis 6.0。

我使用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

未压缩文件:&gt; 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 个答案:

答案 0 :(得分:2)

略过MemoryStream并直接写入文件。

否则为服务器添加更多内存。

指定MemoryStream的初始容量的另一个选项。

答案 1 :(得分:0)

您可能会出现内存不足错误,因为系统上没有500 MB内存流的单个连续内存区域,但您可能有足够的非连续内存块。请改用MemoryTributary类,它可能会起作用。这个类可能需要一些调整(如果我没记错的话,它可能不会干净地返回最后一个块并用ASCII(0)填充它)