我用的是Asp.net,.net 3.5,win2003,iis 6.0。
我使用Oracle收集文件,将文件以SharpZipLib.BZip2压缩格式保存在Oracle表的RAW字段中。
我的应用程序是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();
}
}错误是因为文件“未压缩”很大,非常大(> 500MB)!
压缩文件: 4MB
未压缩文件:>500MB
我做这样的测试:
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();
}
}
}
}有什么建议,评论,示例源代码吗?
发布于 2010-07-30 17:21:51
跳过MemoryStream并直接写入文件。
否则,向服务器添加更多内存。
另一个用于指定MemoryStream初始容量的选项。
发布于 2017-04-20 02:16:44
出现内存不足错误的可能性很大,因为500MB内存流的单个连续内存区在您的系统上不可用,但您可能有足够的非连续内存块。改用MemoryTributary类,它可能会起作用。这个类可能需要一些调整(如果我没记错的话,它可能不会干净地返回最后一个块并用ASCII(0)填充它)
https://stackoverflow.com/questions/3370141
复制相似问题