首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# OutOfMemoryException使用SharpZipLib创建ZipOutputStream

C# OutOfMemoryException使用SharpZipLib创建ZipOutputStream
EN

Stack Overflow用户
提问于 2014-10-17 04:22:25
回答 2查看 2.1K关注 0票数 0

在下面的代码中,我一直得到一个非常恼人的OutOfMemory异常。

我正在压缩许多小文件(PDF,每个文件大约为1.5mb )。

起初,在压缩25个文件后,我得到了异常,这看起来不像是一个海量的归档文件。

设置ZipEntry的大小在某种程度上有所帮助,因为现在我设法压缩了110个文件(我正在visual下调试)

这是我的代码,也许有什么问题。

任何帮助都将不胜感激。

谢谢

代码语言:javascript
复制
    public static MemoryStream Zip(Dictionary<string, byte[]> files)
    {
        var outputMemStream = new MemoryStream();

        var zipStream = new ZipOutputStream(outputMemStream);

        zipStream.SetLevel(9);
        foreach (var file in files)
        {
            zipStream.PutNextEntry(new ZipEntry(file.Key.FmtValidFileName())
                {
                    Size = file.Value.Length
                });
            zipStream.Write(file.Value, 0, file.Value.Length);
            zipStream.Flush();
        }           
        zipStream.Finish();
        outputMemStream.Position = 0;
        return outputMemStream;
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-17 08:23:23

我放弃了使用MemoryStream的尝试,即使在一个拥有16 of内存的64位系统上,我在这一边应该是安全的。

我发现的相关话题是:OutOfMemoryException while populating MemoryStream: 256MB allocation on 16GB system

并使用临时文件来写入/读取数据,而不是内存。

票数 0
EN

Stack Overflow用户

发布于 2014-10-17 05:35:46

和往常一样,一个简洁但完整的代码示例将大大有助于您获得好的答案。

也就是说,您可能需要考虑在System.IO.Compression.ZipArchive中使用(相对较新的) .NET类,它可能比第三方库更少buggy和/或更可靠(尽管我承认SharpZipLib是相当受尊敬的:)。

更重要的是,您可以用ZipArchive值实例化一个新的ZipArchiveMode.Create对象,这将导致压缩的数据直接写入流,而不是缓存在内存中。在这种模式下,内存不足的错误应该是不存在的,不管您要创建多少数据或多少归档项。

编辑:还有一件事:为了确保完全避免内存不足的问题,请确保无论您使用的是什么.zip实现,都要直接写入磁盘。当然,向内存中的临时MemoryStream写入将对您的进程施加限制,否则不需要发生这些限制。

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

https://stackoverflow.com/questions/26417823

复制
相关文章

相似问题

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