我在使用內置的.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的 GZipInputStreamvar 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++;
}
}
看起來類似於[this stackoverflow post](http://stackoverflow.com/questions/505190/net-deflatestream-4gb-limit)。也許它會幫助你? – 2011-04-01 15:22:41
我認爲一個MS Guy實際上對這個帖子發表了評論,他們已經刪除了這個限制。這是我的假設,它應該工作來自:http://stackoverflow.com/questions/505190/net-deflatestream-4gb-limit/505887#505887 – Glenn 2011-04-01 15:28:36
.NET v2/3.5壓縮類看起來像他們有一個4GB限制,但是這個說法在.NET 4中被刪除了。它可能使用了錯誤的類文件嗎?你可以嘗試一些無償的.NET v4嗎? :-) – Ken 2011-04-01 15:32:45