我嘗試使用IonicZip創建總大小爲17 GB的文件的多部分zip文件。使用IonicZip創建帶有Ionic的大型多部分zip失敗並出現OutOfMemoryException
每個zip部分設置爲不大於500 MB左右。
zip.MaxOutputSegmentSize = 500000000;
進入zip文件的文件大小各不相同,但從不大於350MB,通常要小得多,只是幾KB或MB。
我創建zip文件的機器有4GB RAM。
當我開始在我的程序中創建zip文件時,由於使用的RAM,我在某個時候得到了OutOfMemoryException
。
(當所有文件的總大小約爲2GB而不是17GB時,同樣工作正常)。
代碼:
ZipFile zip = new ZipFile(zipFileName, Encoding.UTF8);
zip.CompressionLevel = CompressionLevel.BestCompression;
zip.ParallelDeflateThreshold = -1; // https://stackoverflow.com/questions/11981143/compression-fails-when-using-ionic-zip
zip.MaxOutputSegmentSize = 500000000; // around 500MB
[...]
while (...)
{
zip.AddEntry(adjustedFilePath, File.ReadAllBytes(filepath));
}
zip.Save();
我想知道IonicZip如何處理zip.save與多部分創作組合。不應該有必要把所有的多部分放在記憶中,而只保留現在的那部分,而不是?
由於我將zip.MaxOutputSegmentSize設置爲只有500MB左右,並且進入zip的單個文件的最大大小從不超過350MB,所以我不明白爲什麼它會佔用太多的內存。
另一方面,當發生OutOfMemoryException時,甚至沒有任何單個部分寫入磁盤。通常,在zip文件創建成功的文件數量較少的情況下,多個部分在文件系統上具有不同的創建時間戳,每個間隔5秒。所以我真的不確定IonicZip在內部完成什麼,直到它吐出第一個zip部分。
對不起,我是C#和.NET的新手。 IonicZip是最好的圖書館嗎?我可以使用System.IO.Compression或System.IO.Packaging包(我沒有看到它們支持多部分拉鍊)或商業Xceed?我已經檢查,但並沒有幫助
帖子:
- Compression fails when using ionic zip
- Ionic zip throws out of memory exception
- OutOfMemoryException when creating large ZIP file using System.IO.Packaging(不IonicZip相關)
謝謝。此軟件包是否支持多部分拉鍊,因爲我無法在Google或https://msdn.microsoft.com/de-de/library/system.io.compression.zip文件(v = vs.110) .aspx –
Zip有,但其他人(GZip)沒有。 – PhillipH
你能指點我一些在線API文檔的分割大小可以設置?我仍然無法通過'System.IO.Compression'包找到我可以做到的地方。現在我正在測試Xceed(https://xceed.com/xceed-zip-for-net/)庫作爲替代方案,我可以簡單地說'zip.splitSize = 500000000'。到目前爲止,我看不到任何增加的內存使用量,但它仍然在壓縮我的17GB。 –