巨大的列表<double>保存在小文件中</double>

时间:2013-12-19 15:06:28

标签: c#

我正在尝试在文件中保存大量的双打。现在它看起来像这样:

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 ,我认为这对于二进制数据来说非常多。有谁有任何想法,我怎么能让它变得更小?

另外,请记住,我需要在保存后打开此文件 - 但这是通过其他方法完成的。

4 个答案:

答案 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

可以使用相同的库来打开文件。