存储1万亿行信息的最佳方式

时间:2011-04-19 03:09:35

标签: performance storage space

我正在进行计算,现在生成的文本文件有288012413行,有4列。样本栏:

288012413; 4855 18668 5.5677643628300215

该文件接近12 GB。

这是不合理的。这是纯文本。有更有效的方法吗?我只需要大约3个小数位,但限制器会节省多少空间吗?

8 个答案:

答案 0 :(得分:2)

继续使用MySQL数据库

  • MSSQL express的限制为4GB
  • MS Access的限制为4 GB

所以这些选择都没有了。我认为通过使用像mysql或sSQLLite这样的简单数据库而不进行索引将是你最好的选择。无论如何,使用数据库访问数据可能会更快,最重要的是文件大小可能更小。

答案 1 :(得分:1)

将第4个字段减少到3个小数位应该将文件减少到大约8GB。

答案 2 :(得分:1)

如果它只是数组数据,我会研究类似HDF5的东西:

http://www.hdfgroup.org/HDF5/

该格式受大多数语言支持,具有内置压缩功能,并得到很好的支持和广泛使用。

答案 3 :(得分:1)

那么,

  • 第一列看起来像一个行号 - 如果是这种情况,那么你可以放弃它,每行节省大约11个字符。
  • 如果您只需要大约3个小数位,那么您可以舍入/截断最后一列,可能每行保存另外12个字符。

即。你可以删除每行23个字符。该行长度为40个字符,因此您可以将文件大小减半。

如果您绕过最后一列,那么您应该知道舍入错误可能对您的计算产生的影响 - 如果最终结果需要精确到3 dp,那么您可能希望保留几个额外的数字精度取决于计算类型。

如果文件仅用于存储结果,您可能还需要查看压缩文件。

答案 4 :(得分:1)

如果要将结果用作查找表,为什么要使用ASCII作为数字数据?为什么不定义这样的结构:

struct x {
   long lineno;
   short thing1; 
   short thing2;
   double value;
}

并将结构写入二进制文件?由于所有记录都是已知的大小,因此以后推进这些记录很容易。

答案 5 :(得分:0)

好吧,如果文件很大,并且你正在进行需要任何数字精度的计算,那么你就不会想要一个限制器。这可能弊大于利,而对于12-15 GB的文件,这样的问题将很难调试。我会使用一些压缩实用程序,如GZIP,ZIP,BlakHole,7ZIP或类似的东西来压缩它。

另外,您使用的是什么编码?如果您只是存储数字,您只需要ASCII。如果您使用的是Unicode编码,则会使文件大小翻倍,而不是ASCII。

答案 6 :(得分:0)

像AShelly一样,但更小。

假设线#是连续的......

struct x {   简短的事1   简短的东西2;   短期价值; //你只说3dp所以存储为固定点n * 1000。你得到dp的2位数 }

保存在二进制文件中。

lseek()read()和write()是你的朋友。

文件将在1.7Gb左右大(ish)。

答案 7 :(得分:0)

最明显的答案就是“拆分数据”。把它们放到不同的文件中,例如。每个文件1个行。 NTFS非常擅长处理每个文件夹数十万个文件。

然后,您有很多关于减少数据大小的答案。

接下来,如果您拥有固定大小的结构,为什么要将数据保留为文本?将数字存储为二进制文件 - 这将进一步减少空间(文本格式非常冗余)。

最后,DBMS可以成为您最好的朋友。 NoSQL DBMS应该运行良好,虽然我不是这方面的专家,但我不知道哪一个会持有一万亿条记录。

如果我是你,我会使用固定大小的二进制格式,其中每个记录占用固定(16-20?)字节的空间。然后,即使我将数据保存在一个文件中,我也可以轻松确定我需要在哪个位置开始读取文件。如果你需要进行查找(比如第1列)并且数据不是一直重新生成的话,那么有可能在生成后通过查找键进行一次性排序 - 这会很慢,但是作为一个一次性程序是可以接受的。