我正在尝试在文件中保存大量的双打。现在它看起来像这样:
try{
FileStream fs = new FileStream(saveFileDialog.FileName, FileMode.OpenOrCreate);
using(BinaryWriter binaryWriter = new BinaryWriter(fs))
{
foreach (double value in bigData)
{
binaryWriter.Write(value);
}
binaryWriter.Close();
}
fs.Close();
} catch(System.IO.FileNotFoundException)
{
MessageBox.Show("Unexpected save error\n", "Save error!", MessageBoxButtons.OK);
}
bigData is a List<double>
,在测试用例中,它包含2百万个对象。
保存的文件大约有 15MB ,我认为这对于二进制数据来说非常多。有谁有任何想法,我怎么能让它变得更小?
另外,请记住,我需要在保存后打开此文件 - 但这是通过其他方法完成的。
答案 0 :(得分:9)
双倍是8 bytes long,所以200万次8是大约16MB。似乎没问。
答案 1 :(得分:6)
保存的文件大约有15MB,我认为这对于二进制数据来说非常多。
嗯,double
是8个字节的数据:
Double
值类型表示双精度64位数
你有200万个,所以这意味着1600万字节。似乎对我有好处。
也许您真的想要float
值?这样可以节省一半的尺寸......当然是以精度和范围为代价。
压缩数据可能有帮助,但可能没有 - 这取决于它是否包含大量重复信息。您可能会发现压缩它会增加的大小而不是减少它 - 这只是拥有那么多可能的值的本质。
在不了解您的上下文的情况下,我们无法判断您是否确实拥有15MB 有用信息或是否存在自然冗余。
答案 2 :(得分:2)
Compress it!请注意,作为John states,根据数据,您可能会获得非常好的压缩效果,而您的文件大小可能只有几百K(您输入相同的double
200万次)或者您可能会得到比未压缩版本的文件 更大 (双打的值是一次生成8个字节的良好随机数生成器的输出)。两种极端情况都是极不可能的,你可能会得到某种形式的中间立场,可以减少几MB,但你应该意识到这些可能性。
try
{
using(FileStream fs = new FileStream(saveFileDialog.FileName, FileMode.OpenOrCreate))
using(GZipStream gz = new GZipStream(fs, CompressionMode.Compress))
using(BinaryWriter binaryWriter = new BinaryWriter(gz))
{
foreach (double value in bigData)
{
binaryWriter.Write(value);
}
}
} catch(System.IO.FileNotFoundException)
{
MessageBox.Show("Unexpected save error\n",
"Save error!", MessageBoxButtons.OK);
}
当你去阅读它时,你只需将模式设置为解压缩
using(FileStream fs = new FileStream(openFileDialog.FileName, FileMode.Open))
using(GZipStream gz = new GZipStream(fs, CompressionMode.Decompress))
using(BinaryReader binaryReader = new BinaryReader(gz))
{
//(use the reader as normal here)
}
此外,您应该将fs
放在using
语句中,如果您使用using
语句,则无需致电.Close()
。
答案 3 :(得分:1)
使用Zip算法压缩文件,有很多免费的实现。其中之一(方便地作为NuGet包):DotNetZip
可以使用相同的库来打开文件。