2011-04-01 64 views
3

我在使用內置的.net 4.0 Gzip和Deflate類以編程方式解壓縮3GB(7GB未壓縮)的gzip文件時遇到問題。GzipStream(.net 4.0)4GB問題

我的理解是,他們都應該支持超過4GB的文件,但他們似乎沒有工作。當我用WinRAR手動解壓縮文件,然後通過流讀取器和流水線讀取底層csv文件時,我會得到預期的結果,大約有7500萬行。但是,當使用GzipStream或DeflateStream執行此操作時,流讀取器停止了一半以上(正好在4GB標記周圍),並報告「流結束」並結束而沒有錯誤。在流結束之前,使用這些讀者我只能達到大約3400萬行。

然後我嘗試了最新的.net zip http://dotnetzip.codeplex.com/二進制文件,它會中途通過並引發錯誤。 「目標數組不夠長,請檢查destIndex和長度以及數組的下限。」

我沒有創建這個文件,但我們從來沒有遇到過來自同一個源的小文件的麻煩,所以我懷疑有關大小的問題導致了這個問題。這可能是用來創建這個文件的工具不符合64位,但在我去bug的創造者之前,我想確保bug在gzip提取器邏輯中不在我們這邊。

任何想法將不勝感激。 實施例提取碼和下面的測試方法:

使用從 SharpZip代替Io.GZipStream的 GZipInputStream
var msGZ = 0;//gives 34million 
var fileName = @"C:\MyFile.csv.gz"; 
using (System.IO.Stream input = System.IO.File.OpenRead(filename)) 
using (var gz = new GZipStream(stream, CompressionMode.Decompress)) 
using (var r = new StreamReader(gz)) 
{ 
    while (!r.EndOfStream) 
    { 
     r.ReadLine(); 
     msGZ++; 
    } 
} 



var msDF = 0; //gives 34million 
using (System.IO.Stream input = System.IO.File.OpenRead(filename)) 
using (var df = new DeflateStream(stream, CompressionMode.Decompress)) 
using (var r = new StreamReader(df)) 
{ 
    while (!r.EndOfStream) 
    { 
     r.ReadLine(); 
     msDF++; 
    } 
} 



var csvCount = 0;//roughly 75million lines 

using (var ms = System.IO.File.OpenRead("UncompressedBYWinRAR.csv")) 
{ 
    var r = new StreamReader(ms); 
    while (!r.EndOfStream) 
    { 
     r.ReadLine(); 
     csvCount++; 
    } 
} 




var zipNet = 0; 

//Zip.Net throws this error half way through at around line 34million 
//"Destination array was not long enough. Check destIndex and length, and the array's lower bounds." 

using (System.IO.Stream input = System.IO.File.OpenRead(filename)) 
using (Stream decompressor = new Ionic.Zlib.GZipStream(input, Ionic.Zlib.CompressionMode.Decompress, true)) 
using (var r = new StreamReader(decompressor)) 
{ 
    while (!r.EndOfStream) 
    { 
     r.ReadLine(); 
     zipNet++; 
    } 
} 
+2

看起來類似於[this stackoverflow post](http://stackoverflow.com/questions/505190/net-deflatestream-4gb-limit)。也許它會幫助你? – 2011-04-01 15:22:41

+0

我認爲一個MS Guy實際上對這個帖子發表了評論,他們已經刪除了這個限制。這是我的假設,它應該工作來自:http://stackoverflow.com/questions/505190/net-deflatestream-4gb-limit/505887#505887 – Glenn 2011-04-01 15:28:36

+1

.NET v2/3.5壓縮類看起來像他們有一個4GB限制,但是這個說法在.NET 4中被刪除了。它可能使用了錯誤的類文件嗎?你可以嘗試一些無償的.NET v4嗎? :-) – Ken 2011-04-01 15:32:45

回答

0

提供的解決方案。