Sto tentando di eseguire il debug di un OutOfMemoryException
che si verifica quando si crea un file ZIP
piuttosto grande utilizzando System.IO.Packaging.ZipPackage
.OutOfMemoryException durante la creazione di file ZIP di grandi dimensioni mediante System.IO.Packaging
Il codice sta scorrendo un lungo elenco di oggetti, eseguendo le seguenti operazioni per ciascun oggetto.
- Serializzazione dei dati oggetto in un file temporaneo.
- Creazione di un
PackagePart
per il file. - copia da una fonte
System.IO.Stream
ad un altro: flusso- Fonte:
FileStream
- flusso di destinazione:
PackagePart::GetStream()
=>MS.Internal.IO.Zip.ZipIOModeEnforcingStream
- Fonte:
Infine chiama Package::Close()
che salva il file.
Il problema che sto avendo è che per un elenco particolarmente grande di oggetti, sto vedendo un OutOfMemoryException
(la dimensione del processo x86 arriva a circa 1,2 GB di dimensione).
Stavo pensando di suddividere i dati oggetto in blocchi, quindi elaboro solo una quantità minore per ciclo (ad esempio, i passaggi 1-3 sopra). L'idea è che vorrei creare i file ZIP n
in una directory temporanea, e quindi trovare un modo per combinarli in un unico archivio.
È possibile utilizzare System.IO.Packaging
? Cosa dovrei usare per combinare le parti?
O c'è un modo migliore per risolvere questo problema?
Prova a chiamare Lavare tra l'iterazione durante la creazione di un nuovo pacchetto – Ankur
@Ankur: l'hai inchiodato, che sembrava fare il trucco. Se aggiorni il tuo commento a una risposta, sarò felice di accettarlo. – LeopardSkinPillBoxHat