首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用BZip2的OutOfMemoryException (SharpZipLib)

使用BZip2的OutOfMemoryException (SharpZipLib)
EN

Stack Overflow用户
提问于 2010-07-30 17:18:32
回答 2查看 1.5K关注 0票数 1

我用的是Asp.net,.net 3.5,win2003,iis 6.0。

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

我的应用程序是Web,我使用WCF服务获取文件的数据(字节数组)。aspx页面将文件发送给用户(下载文件)。

我的问题-问题:

我从Oracle读取数据(我调用WCF服务)。我得到字节数组(byte[]),

我尝试使用SharpZipLib.BZip2解压文件

代码语言:javascript
复制
using (MemoryStream inData = new MemoryStream(data))
{ 
using (MemoryStream outData = new MemoryStream())
{
          BZip2.Decompress(inData, outData); //<==================== Fails here OutOfMemoryException
          return outData.ToArray();
}

}

错误是因为文件“未压缩”很大,非常大(> 500MB)!

压缩文件: 4MB

未压缩文件:>500MB

我做这样的测试:

代码语言:javascript
复制
BufferedStream bufin = new BufferedStream(instream);

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

                return outData.ToArray();
            }

但我得到的是相同的OutOfMemoryException

异常的跟踪堆栈

代码语言:javascript
复制
   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代码

代码语言:javascript
复制
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();

                             }

                        }

                  }

            }

有什么建议,评论,示例源代码吗?

EN

回答 2

Stack Overflow用户

发布于 2010-07-30 17:21:51

跳过MemoryStream并直接写入文件。

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

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

票数 2
EN

Stack Overflow用户

发布于 2017-04-20 02:16:44

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3370141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档