GzipStream(.net 4.0)4GB问题

时间:2011-04-01 15:16:43

标签: .net c#-4.0 gzip gzipstream deflatestream

我无法使用内置的.net 4.0 Gzip和Deflate类以编程方式解压缩3GB(7GB未压缩)gzip文件。

我的理解是他们都应该支持超过4GB的文件,但它们似乎不起作用。当我使用WinRAR手动解压缩相关文件,然后使用流读取器和计数行流过底层csv文件时,我得到了预期的结果,大约7500万行。但是,当使用GzipStream或DeflateStream执行此操作时,流读取器会停止一半(在4GB标记左右)并报告“流结束”并结束而不会出现错误。使用这些读者,我只能在流程结束前达到大约3400万行。

然后我尝试了.net zip http://dotnetzip.codeplex.com/的最新二进制文件,它得到了一半并抛出错误。 “目标数组不够长。检查destIndex和长度,以及数组的下限。”

我没有创建这个文件,但是之前我们从来没有遇到来自同一来源的小文件的麻烦,所以我怀疑大小的某些原因导致了这个问题。可能是用于创建此文件的工具不符合64位,但在我创建bug之前,我想确保在gzip提取器逻辑中不存在错误。

任何想法都将不胜感激。 示例提取代码和测试方法如下:

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++;
    }
}

1 个答案:

答案 0 :(得分:0)

使用 SharpZip 中的 GZipInputStream 代替Io.GZipStream提供了解决方案。