Estoy intentando depurar un OutOfMemoryException
que se produce al crear un archivo bastante grande ZIP
utilizando System.IO.Packaging.ZipPackage
.OutOfMemoryException al crear un archivo ZIP de gran tamaño utilizando System.IO.Packaging
El código se repite en una gran lista de objetos, haciendo lo siguiente para cada objeto.
- serialización de los datos del objeto en un archivo temporal.
- Creando un
PackagePart
para el archivo. - Copia de una fuente a otra
System.IO.Stream
: flujo- Fuente:
FileStream
- flujo Objetivo:
PackagePart::GetStream()
=>MS.Internal.IO.Zip.ZipIOModeEnforcingStream
- Fuente:
finalmente llama Package::Close()
la que guarda el archivo.
El problema que tengo es que para una lista particularmente grande de objetos, estoy viendo un OutOfMemoryException
(el tamaño del proceso x86 es de aproximadamente 1.2GB de tamaño).
Estaba pensando en dividir los datos del objeto en fragmentos, por lo que solo proceso una cantidad menor por ciclo (es decir, los pasos 1-3 anteriores). La idea es crear archivos ZIP n
en un directorio temporal, y luego encontrar una forma de combinarlos en un solo archivo.
¿Es esto posible usando System.IO.Packaging
? ¿Qué usaría para combinar las partes?
¿O existe una forma mejor de corregir esto?
Intenta llamar a Flush entre la iteración cuando creas un nuevo paquete – Ankur
@Ankur: ya lo has encontrado, eso pareció ser el truco. Si actualizas tu comentario a una respuesta, estaré encantado de aceptarlo. – LeopardSkinPillBoxHat