C#OutOfMemoryException使用SharpZipLib创建ZipOutputStream

本文关键字:ZipOutputStream 创建 SharpZipLib 使用 C#OutOfMemoryException | 更新日期: 2023-09-27 18:26:47

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

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

起初,我得到了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;
    }

C#OutOfMemoryException使用SharpZipLib创建ZipOutputStream

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

也就是说,你可能想考虑在.NET中使用(相对较新的)System.IO.Compression.ZipArchive类。它可能比第三方库更不容易出错和/或更可靠(尽管我承认SharpZipLib受到了相当好的尊重:)。

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

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

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

我发现的相关主题是:填充MemoryStream时出现OutOfMemoryException:16GB系统上的256MB分配

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