我正在尝试将大 UInt16 数组保存到文件中。 positionCnt大约50000,stationCnt大约2500。直接保存,没有GZipStream,文件大约250MB,可以通过外部zip程序压缩到19MB。使用以下代码,文件为 507MB。我做错了什么?

GZipStream cmp = new GZipStream(File.Open(cacheFileName, FileMode.Create), CompressionMode.Compress);
BinaryWriter fs = new BinaryWriter(cmp);
fs.Write((Int32)(positionCnt * stationCnt));
for (int p = 0; p < positionCnt; p++)
{
    for (int s = 0; s < stationCnt; s++)
    {
       fs.Write(BoundData[p, s]);
    }
}
fs.Close();

最佳答案

不确定您正在运行的 .NET 版本。在早期版本中,它使用的窗口大小与您从中写入的缓冲区大小相同。因此,在您的情况下,它会尝试单独压缩每个整数。我认为他们在 .NET 4.0 中改变了这一点,但尚未验证。

无论如何,您要做的是在 GZipStream 之前创建一个缓冲流:

//创建具有 64 KB 缓冲区的文件流
FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None, 65536);
GZipStream cmp = new GZipStream(fs, CompressionMode.Compress);
...

GZipStream cmp = new GZipStream(File.Open(cacheFileName, FileMode.Create), CompressionMode.Compress);
BufferedStream buffStrm = new BufferedStream(cmp, 65536);
BinaryWriter fs = new BinaryWriter(buffStrm);

这样,GZipStream以64 KB块的形式获取数据,并且可以做得更好。

大于 64KB 的缓冲区不会为您提供更好的压缩。

关于c# - GZipStream 有效性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7588785/

10-10 04:05