2011-04-19 99 views
1

我正在进行计算,现在生成的文本文件有288012413行,有4列。样本列:存储1万亿行信息的最佳方式

288012413; 4855 18668 5.5677643628300215 

该文件接近12 GB的。

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

+0

如何压缩? – Mehrdad 2011-04-19 03:12:08

+2

还挺取决于你以后计划如何处理数据文件。 Gbs便宜 – Ben 2011-04-19 03:12:54

+0

它将不断用作查找表。 – evanlivingston 2011-04-19 03:14:09

回答

1

好,

  • 第一列看起来很像一个行号 - 如果这是节约每行约11个字符的话,那么你可能刚刚摆脱它。
  • 如果您只需要大约3位小数,则可以舍入/截断最后一列,每行可能会保存另外12个字符。

I.e.你可以摆脱每行23个字符。该行长度为40个字符,因此您可以近似减半文件大小。

如果你在最后一列做圆角,那么你应该知道舍入误差可能对你的计算产生的影响 - 如果最终结果需要精确到3 dp,那么你可能想保留一些额外的数字的精度取决于计算的类型。

如果文件仅用于存储结果,您可能还想研究压缩文件。

1

将第4个字段减少到小数点后3位应该将文件减少到8GB左右。

1

如果只是阵列中的数据,我会去了解一下像HDF5:

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

格式支持大多数语言中,有内置的压缩​​和有良好的支持和广泛的应用。

0

好吧,如果文件很大,并且您正在进行计算,需要对数字进行任何精确的处理,那么您不需要限制器。这可能会造成更多的伤害而不是好处,并且对于12-15 GB的文件,这样的问题将很难调试。我会使用一些压缩工具,比如GZIP,ZIP,BlakHole,7ZIP或类似的东西来压缩它。

此外,你使用什么编码?如果你只是存储数字,你只需要ASCII码。如果您使用的是Unicode编码,那么这将会使文件大小与ASCII大小成倍增长。

2

继续使用MySQL数据库

  • MSSQL Express有4GB
  • MS访问的限制为4 GB的限制

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

1

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

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

并将结构写入二进制文件?由于所有的记录都是已知的大小,以后通过它们很容易。

0

像AShelly,但更小。

假设线#'s为连续...

结构X { 短thing1; short thing2; 空头值; //你只说了3dp。所以存储为固定点n * 1000。你会得到dp }的2位数字}

保存在二进制文件中。 ()和write()是你的朋友。

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

0

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

然后,您已经得到了许多关于减小数据大小的答案。

接下来,为什么保持数据为文本,如果你有一个固定大小的结构?将数字存储为二进制文件 - 这会减少更多空间(文本格式非常多)。

最后,DBMS可以成为你最好的朋友。 NoSQL数据库管理系统应该运行良好,虽然我不是这方面的专家,我不知道哪一个会保存万亿条记录。

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

相关问题