我正在进行计算,现在生成的文本文件有288012413行,有4列。样本列:存储1万亿行信息的最佳方式
288012413; 4855 18668 5.5677643628300215
该文件接近12 GB的。
这是不合理的。这是纯文本。有没有更高效的方法?我只需要大约3位小数,但是限制器会节省多少空间?
我正在进行计算,现在生成的文本文件有288012413行,有4列。样本列:存储1万亿行信息的最佳方式
288012413; 4855 18668 5.5677643628300215
该文件接近12 GB的。
这是不合理的。这是纯文本。有没有更高效的方法?我只需要大约3位小数,但是限制器会节省多少空间?
好,
I.e.你可以摆脱每行23个字符。该行长度为40个字符,因此您可以近似减半文件大小。
如果你在最后一列做圆角,那么你应该知道舍入误差可能对你的计算产生的影响 - 如果最终结果需要精确到3 dp,那么你可能想保留一些额外的数字的精度取决于计算的类型。
如果文件仅用于存储结果,您可能还想研究压缩文件。
将第4个字段减少到小数点后3位应该将文件减少到8GB左右。
好吧,如果文件很大,并且您正在进行计算,需要对数字进行任何精确的处理,那么您不需要限制器。这可能会造成更多的伤害而不是好处,并且对于12-15 GB的文件,这样的问题将很难调试。我会使用一些压缩工具,比如GZIP,ZIP,BlakHole,7ZIP或类似的东西来压缩它。
此外,你使用什么编码?如果你只是存储数字,你只需要ASCII码。如果您使用的是Unicode编码,那么这将会使文件大小与ASCII大小成倍增长。
继续使用MySQL数据库
所以这些选项都出来了。我认为通过使用像mysql或sSQLLite这样的简单数据库而不进行索引是最好的选择。无论如何,使用数据库访问数据的速度可能会更快,而且文件大小可能更小。
如果您打算将结果用作查找表,为什么要将ASCII用于数字数据?为什么不定义像这样的结构:
struct x {
long lineno;
short thing1;
short thing2;
double value;
}
并将结构写入二进制文件?由于所有的记录都是已知的大小,以后通过它们很容易。
像AShelly,但更小。
假设线#'s为连续...
结构X { 短thing1; short thing2; 空头值; //你只说了3dp。所以存储为固定点n * 1000。你会得到dp }的2位数字}
保存在二进制文件中。 ()和write()是你的朋友。
文件将在1.7Gb左右变大(ish)。
最明显的答案就是“拆分数据”。把它们放到不同的文件中,例如。每个文件1百万行。 NTFS非常擅长处理每个文件夹中数十万个文件。
然后,您已经得到了许多关于减小数据大小的答案。
接下来,为什么保持数据为文本,如果你有一个固定大小的结构?将数字存储为二进制文件 - 这会减少更多空间(文本格式非常多)。
最后,DBMS可以成为你最好的朋友。 NoSQL数据库管理系统应该运行良好,虽然我不是这方面的专家,我不知道哪一个会保存万亿条记录。
如果我是你,我会选择固定大小的二进制格式,每个记录占用固定的(16-20?)个字节的空间。然后,即使我将数据保存在一个文件中,我也可以轻松确定需要从哪个位置开始读取文件。如果你需要查找(比如说第1列)并且数据不是一直重新生成的,那么可以通过生成后的查找键进行一次性排序 - 这会很慢,但是作为一次性程序是可以接受的。
如何压缩? – Mehrdad 2011-04-19 03:12:08
还挺取决于你以后计划如何处理数据文件。 Gbs便宜 – Ben 2011-04-19 03:12:54
它将不断用作查找表。 – evanlivingston 2011-04-19 03:14:09