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

Leo*_*Hat 6 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

最后它调用Package::Close()保存文件.

我遇到的问题是,对于一个特别大的对象列表,我看到了OutOfMemoryException(x86进程大小增加到大约1.2GB).

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

这可能用System.IO.Packaging吗?我会用什么来组合这些部件?

或者有更好的方法来解决这个问题吗?

Ank*_*kur 3

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