c# – GZipStream有效性

我想将大的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,CompressionMode.Compress);
BufferedStream buffStrm = new BufferedStream(cmp,65536);
BinaryWriter fs = new BinaryWriter(buffStrm);

这样,GZipStream以64 KB的块的形式获取数据,并且可以更好地进行压缩.

大于64KB的缓冲区不会给你更好的压缩.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...