- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在使用内置的 .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 提取器逻辑中的 bug 不在我们这边。
如有任何想法,我们将不胜感激。示例提取代码和测试方法如下:
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++;
}
}
最佳答案
使用 SharpZip 中的 GZipInputStream 代替 Io.GZipStream 提供了解决方案。
关于.net - GzipStream (.net 4.0) 4GB 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5515339/
知道我该怎么做吗?我能够压缩单个文件。 最佳答案 您不能直接 GZip 整个文件夹,因为 GZip 对单个数据流进行操作。您首先必须将文件夹转换为这样的流。 一种方法是创建一个 Tar archive
下面这段代码有什么问题。我总是得到 FALSE,意思是压缩后,解压后的数据与原始值不匹配。 public static bool Test() { string
我正在尝试在 C# 中使用 gzip 流,但压缩后的文件似乎比以前大。当我处理 .avi 和 .mkv 文件时会发生这种情况。但是,如果我使用比原始文件小的 .txt 和 .html 压缩文件。 us
我正在尝试使用 Gzip 压缩来压缩 JSON 文件以发送到另一个位置。它每天需要处理 5,000 - 10,000 个文件,我不需要本地机器上文件的压缩版本(它们实际上正在传输到 AWS S3 以进
我的 GZipStream 只会解压缩文件的第一行。通过 7-zip 提取内容按预期工作并为我提供了整个文件内容。它还在 cygwin 和 linux 上使用 gunzip 按预期提取,所以我希望这是
打开zip文件时出现问题。我正在使用以下代码来压缩文件: public static string Zip_File(string soruce , string target) { try
我正在 Windows Phone 7 上开发一个应用程序。我需要压缩/解压缩我的数据以便通过 tcp 套接字发送它。 但我一直没能找到任何 gzip 压缩器用于通过 tcp 套接字的仅转发流。 请帮
我有应该进行压缩的代码: FileStream fs = new FileStream("g:\\gj.txt", FileMode.Open); FileStream fd = new FileSt
我在 .NET 4.0 中遇到了一些奇怪的依赖于机器/操作系统的 GZipStream 行为。这是相关代码: public static string Compress(string input) {
我正在尝试压缩大量数据,有时在 100GB 左右,当我运行我编写的例程时,它看起来文件大小与以前的大小完全相同。还有其他人遇到过 GZipStream 的这个问题吗? 我的代码如下:
我遇到了一个针对 .Net 3.5 的 gzipstream 的讨厌问题。这是我第一次使用 gzipstream,但是我已经模仿了许多教程,包括 here我仍然卡住了。 我的应用程序将数据表序列化为
我正在尝试读取文件并使用 GZipStream 压缩它,如下所示: using (var outStream = new MemoryStream()) { using (var fileSt
我需要一种将 GZipStream 写入字符串的方法。 我正在使用: GZipStream Decompress = new GZipStream(inFile, CompressionMode.De
我正在尝试将大型 UInt16 数组保存到文件中。 positionCnt大约是50000,stationCnt大约是2500。直接保存,没有GZipStream,文件大约250MB,可以通过外部zi
我有一些代码可以下载 gzip 文件并解压缩它们。问题是,我无法让它解压缩整个文件,它只读取前 4096 个字节,然后再读取大约 500 个字节。 Byte[] buffer = new Byte[4
我正在使用以下代码来压缩文件并且它工作正常但是当我使用 WinRar 解压缩时我得到没有扩展名的原始文件名,任何线索为什么如果文件名是 myReport.xls 当我解压缩我只得到 myReport
我正在使用 .NET 框架中的 GZipStream 类压缩一些数据包。一切正常,压缩率也不错,但是当我使用十六进制编辑器查看压缩数据时,我注意到每个压缩数据包中有多达三分之一是尾随零。这正常吗? 大
我正在使用 .NET 框架中的 GZipStream 类压缩一些数据包。一切正常,压缩率也不错,但是当我使用十六进制编辑器查看压缩数据时,我注意到每个压缩数据包中有多达三分之一是尾随零。这正常吗? 大
我正在尝试将非常大的对象直接序列化为 zip 流。我设法通过在中间步骤中序列化到文件流、将其加载回来然后压缩它来做到这一点。 我还尝试过直接压缩到内存流并且它有效。但是当我使用 GZipStream
我可以获取磁盘上文件的 GZipStream 而不将整个压缩内容写入临时存储吗?我目前正在磁盘上使用临时文件,以避免在非常大的文件上使用 MemoryStream 可能出现的内存耗尽(这工作正常)。
我是一名优秀的程序员,十分优秀!