GzipStream (.net 4.0) 4GB 问题

3

我在使用内置的.NET 4.0 Gzip和Deflate类对一个3GB(7GB未压缩)的gzip文件进行程序化解压时遇到了问题。

据我所知,它们都应该支持超过4GB的文件,但它们似乎不起作用。当我使用WinRAR手动解压缩所涉及的文件,然后通过流阅读器流式传输底层的csv文件并计算行数时,我得到了预期的结果,大约7500万行。然而,当使用GzipStream或DeflateStream进行此操作时,流阅读器在一半左右停止(刚好在4GB处),报告“流的结尾”,没有错误结束。使用这些读取器,我只能达到约3400万行,然后流就结束了。

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

我没有创建这个文件,但我们之前从同一来源获得的较小文件从未出现过问题,因此我怀疑大小是导致问题的原因。可能是创建此文件的工具不符合64位规范,但在我去打扰创建者之前,我想确保错误不是由我们的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++;
    }
}

2
类似于这个stackoverflow帖子。也许对你有帮助? - Marcin Deptuła
我认为一个微软的人实际上在那篇文章中发表了评论,他们已经移除了限制。这就是我认为它应该可以工作的原因:https://dev59.com/CUbRa4cB1Zd3GeqP0G2d#505887 - Glenn
1
.NET v2/3.5的压缩类似乎有4GB的限制,但这个备注在.NET 4中被移除了。可能是在使用错误的类文件吗?你可以试试做一些纯粹为.NET v4而设计的操作吗? :-) - Ken
1
我已经阅读了这个,然后我查看了msdn网站(.net 4.0版本),上面说压缩大于4GB的文件仍会抛出异常。但是关于解压缩没有提到任何内容。也许这是一个bug :-) - Marcin Deptuła
1
请在connect.microsoft.com上发布带有支持文档的错误报告。 - Hans Passant
我将运行更多的测试并回报。你们中有谁能推荐一个开源替代品吗?.net zip被推荐了,但它在这个大小的文件上失败了。 - Glenn
1个回答

0

使用来自SharpZipGZipInputStream而不是提供的Io.GZipStream解决了问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接