我正在尝试调试使用OutOfMemoryException
创建相当大的ZIP
文件时出现的System.IO.Packaging.ZipPackage
。
代码遍历大量对象,为每个对象执行以下操作。
PackagePart
。System.IO.Stream
复制到另一个:
FileStream
PackagePart::GetStream()
=> MS.Internal.IO.Zip.ZipIOModeEnforcingStream
最后调用保存文件的Package::Close()
。
我遇到的问题是,对于特别大的对象列表,我看到OutOfMemoryException
(x86进程大小达到大约1.2GB)。
我正在考虑将对象数据划分为块,因此我每个循环只处理较小的量(即上面的步骤1-3)。我的想法是,我会在临时目录中创建n
个ZIP文件,然后找到一种方法将它们组合成一个存档。
这可以使用System.IO.Packaging
吗?我会用什么来组合这些部分?
或者有更好的解决方法吗?
答案 0 :(得分:3)
在创建新包之间调用Package对象上的Flush
方法应该可以解决问题,因为这会导致内存缓冲区刷新到磁盘。
答案 1 :(得分:0)
我会使用DotNetZip库(http://dotnetzip.codeplex.com/)。我已经尝试了几个zip库(像你目前使用的System.IO以及SharpZibLib)和远最容易使用的是DotNetZip库。
你几乎肯定会得到更少的代码行,并且我发现内存使用率非常好(在我报告的虚拟机环境中出现问题并且新版本修复了它)。