dotnet/runtime
Auf GitHub ansehenSystem.IO.Compression: ZipArchive loads entire file in memory on .Dispose
Open
#1.543 geöffnet am 13. Sept. 2016
area-System.IO.Compressionenhancementhelp wantedtenet-performance
Repository-Metriken
- Stars
- (17.886 Stars)
- PR-Merge-Metriken
- (Durchschn. Merge 12T 11h) (661 gemergte PRs in 30 T)
Beschreibung
When you open a ZipArchive in Update mode, the entire zip file will be loaded in memory when the .Dispose method is invoked.
This is because .Dipose calls .WriteFile, which:
- Calls
LoadLocalHeaderExtraFieldAndCompressedBytesIfNeededfor all entries, which loads the compressed data into memory for those entries - Sets the size of the .zip archive to 0, by calling
_archiveStream.SetLength(0); - Writes out all entries one by one.
As a result:
- A lot of memory is used, the compressed data for each entry is loaded into memory
- A lot of unnecessary disk I/O is performed, because all entries are written out again, even if they were not modified.
An alternative may be to incrementally update the zip archive, and only update entries which changes.