2016-08-19 75 views
1

我嘗試使用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?我已經檢查,但並沒有幫助

帖子:

回答

0

我想出的解決方案似乎是最好的努力(我不想重新發明輪子併爲標準zip /壓縮包編寫多部分邏輯,似乎是這樣一個標準應該是任何壓縮包的一部分的東西)是使用Xceed,並且幾乎像IonicZip一樣使用相同的代碼邏輯。

看來,IonicZip並沒有真正以有效的方式處理它在內存方面。 Xceed工作正常,內存使用量沒有大幅增加。

 using Xceed.Zip; 
     using Xceed.FileSystem; 

     [...] 

     ZipArchive zip = new ZipArchive(new DiskFile(zipFileName)); 
     zip.SplitNameFormat = SplitNameFormat.PkZip; 
     zip.SplitSize = 500000; 
     zip.DefaultCompressionLevel = Xceed.Compression.CompressionLevel.Highest; 
     zip.TempFolder = new DiskFolder(@"C:\temp"); 
     new DiskFolder(localSourceFolder).CopyFilesTo(zip, true, true); 
0

我建議使用內置的.NET系統。 IO.Compression命名空間類來壓縮/解壓縮文件;它們是基於流的,而您的示例在這裏不使用流 - 所以必須使用RAM來存儲壓縮數據。使用.net本機庫,您可以將壓縮數據以塊的形式寫入輸出流。

+0

謝謝。此軟件包是否支持多部分拉鍊,因爲我無法在Google或https://msdn.microsoft.com/de-de/library/system.io.compression.zip文件(v = vs.110) .aspx –

+0

Zip有,但其他人(GZip)沒有。 – PhillipH

+0

你能指點我一些在線API文檔的分割大小可以設置?我仍然無法通過'System.IO.Compression'包找到我可以做到的地方。現在我正在測試Xceed(https://xceed.com/xceed-zip-for-net/)庫作爲替代方案,我可以簡單地說'zip.splitSize = 500000000'。到目前爲止,我看不到任何增加的內存使用量,但它仍然在壓縮我的17GB。 –

相關問題