OutOfMemoryException al crear un archivo ZIP grande utilizando System.IO.Packaging

Estoy tratando de depurar una OutOfMemoryException que se produce al crear un archivo ZIP bastante grande con System.IO.Packaging.ZipPackage .

El código está iterando a través de una gran lista de objetos, haciendo lo siguiente para cada objeto.

  1. Serialización de los datos del objeto en un archivo temporal.
  2. Creando un PackagePart para el archivo.
  3. Copie de una fuente System.IO.Stream a otra:
    • Secuencia de la fuente: FileStream
    • PackagePart::GetStream() destino: PackagePart::GetStream() => MS.Internal.IO.Zip.ZipIOModeEnforcingStream

Finalmente, llama a Package::Close() que guarda el archivo.

El problema que tengo es que para una lista particularmente grande de objetos, veo una OutOfMemoryException (el tamaño del proceso x86 está llegando a aproximadamente 1,2 GB de tamaño).

Estaba pensando en dividir los datos del objeto en partes, así que solo procuro una cantidad más pequeña por bucle (es decir, los pasos 1-3 anteriores). La idea es que crearía n archivos ZIP en un directorio temporal y luego encontraría la manera de combinarlos en un solo archivo.

¿Es esto posible usando System.IO.Packaging ? ¿Qué usaría para combinar las partes?

¿O hay una mejor manera de arreglar esto?

Si invoca el método Flush en el objeto Package entre la creación de un paquete nuevo, probablemente debería resolver el problema, ya que eso provocaría que el búfer de la memoria se vacíe en el disco.

Yo usaría la biblioteca DotNetZip ( http://dotnetzip.codeplex.com/ ). He probado varias bibliotecas zip (System.IO como las que usas actualmente y también SharpZibLib) y, con mucho, la más fácil de usar es la biblioteca DotNetZip.

Es casi seguro que terminará con menos líneas de código y encontré que el uso de la memoria es muy bueno (tuve un problema en un entorno de máquina virtual que informé y una nueva versión lo solucionó).