我使用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();
}
}
}
}
任何建议,评论,示例源代码?
答案 0 :(得分:2)
略过MemoryStream
并直接写入文件。
否则为服务器添加更多内存。
指定MemoryStream
的初始容量的另一个选项。
答案 1 :(得分:0)
您可能会出现内存不足错误,因为系统上没有500 MB内存流的单个连续内存区域,但您可能有足够的非连续内存块。请改用MemoryTributary类,它可能会起作用。这个类可能需要一些调整(如果我没记错的话,它可能不会干净地返回最后一个块并用ASCII(0)填充它)