【发布时间】:2023-03-29 09:42:01
【问题描述】:
我在以下代码中不断收到非常烦人的 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;
}
【问题讨论】:
-
实现
IDisposible的每个类都需要放入using块中。如果您有支持它的 Visual Studio 版本,则可以打开静态代码分析,以便在忘记正确执行时收到警告。 -
恐怕没用。 OutOfMemoryException 发生在文件的循环内。我不能将 outputMemStream 放在 using 中,因为我将它用作返回。我尝试使用缓冲区而不是完全写入文件,但这也无济于事,问题不在于我要压缩的每个文件的大小,而是所有文件的总大小。
-
您应该创建一个小型、独立的示例。据我们所知,
FmtValidFileName可以由throw new OutOfMemoryException();组成。准备一个示例,人们可以使用最佳实践复制和编译自己,它会更容易为您提供帮助。 -
FmtValidFileName 是字符串的扩展方法,用于从正在压缩的文件名中删除任何模糊字符,因此这不是问题。此外,我不能提供比我给出的代码提取更多的东西,它是我得到的最小的,我正在针对由 160 条记录组成的 Dictionary
文件运行它,每个 byte[] 大约为 1434167 字节大约是 1.3Mb,它会在压缩大约 100 个文件后抛出 OutOfMemory。
标签: c# zip out-of-memory zipoutputstream