繁体   English   中英

C# OutOfMemoryException 使用 SharpZipLib 创建 ZipOutputStream

[英]C# OutOfMemoryException creating ZipOutputStream using SharpZipLib

我在以下代码中不断收到非常烦人的 OutOfMemory 异常。

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

起初,我在压缩了 25 个文件后遇到了异常,这似乎不是一个大规模存档。

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

这是我的代码,可能有问题。

任何帮助将不胜感激。

谢谢

    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;
    }

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

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

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

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

我放弃了使用 MemoryStream 的尝试,即使在具有 16GB 内存的 64 位系统上我应该在那一侧是安全的。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM