我正在进行计算,现在生成的文本文件有288012413行,有4列。样本栏:
288012413; 4855 18668 5.5677643628300215
该文件接近12 GB。
这是不合理的。这是纯文本。有更有效的方法吗?我只需要大约3个小数位,但限制器会节省多少空间吗?
答案 0 :(得分:2)
继续使用MySQL数据库
所以这些选择都没有了。我认为通过使用像mysql或sSQLLite这样的简单数据库而不进行索引将是你最好的选择。无论如何,使用数据库访问数据可能会更快,最重要的是文件大小可能更小。
答案 1 :(得分:1)
将第4个字段减少到3个小数位应该将文件减少到大约8GB。
答案 2 :(得分:1)
答案 3 :(得分:1)
那么,
即。你可以删除每行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列)并且数据不是一直重新生成的话,那么有可能在生成后通过查找键进行一次性排序 - 这会很慢,但是作为一个一次性程序是可以接受的。