使用System.IO.Packaging创建大型ZIP文件时出现OutOfMemoryException

时间:2011-10-21 03:35:09

标签: c# packaging out-of-memory

我正在尝试调试使用OutOfMemoryException创建相当大的ZIP文件时出现的System.IO.Packaging.ZipPackage

代码遍历大量对象,为每个对象执行以下操作。

  1. 将对象数据序列化为临时文件。
  2. 为文件创建PackagePart
  3. 从源System.IO.Stream复制到另一个:
    • 源流:FileStream
    • 目标流:PackagePart::GetStream() => MS.Internal.IO.Zip.ZipIOModeEnforcingStream
  4. 最后调用保存文件的Package::Close()

    我遇到的问题是,对于特别大的对象列表,我看到OutOfMemoryException(x86进程大小达到大约1.2GB)。

    我正在考虑将对象数据划分为块,因此我每个循环只处理较小的量(即上面的步骤1-3)。我的想法是,我会在临时目录中创建n个ZIP文件,然后找到一种方法将它们组合成一个存档。

    这可以使用System.IO.Packaging吗?我会用什么来组合这些部分?

    或者有更好的解决方法吗?

2 个答案:

答案 0 :(得分:3)

在创建新包之间调用Package对象上的Flush方法应该可以解决问题,因为这会导致内存缓冲区刷新到磁盘。

答案 1 :(得分:0)

我会使用DotNetZip库(http://dotnetzip.codeplex.com/)。我已经尝试了几个zip库(像你目前使用的System.IO以及SharpZibLib)和最容易使用的是DotNetZip库。

你几乎肯定会得到更少的代码行,并且我发现内存使用率非常好(在我报告的虚拟机环境中出现问题并且新版本修复了它)。