【发布时间】:2018-05-22 12:40:31
【问题描述】:
这里的话题很大,我是新手,我正在寻找方向,因为这个话题的可能性似乎无穷无尽。
我正在运行一个数值模拟,它会创建大量数据,我希望不再以纯文本形式存储它(一旦我尝试保存所有创建的数据并最终得到一个 4TB 的 txt 文件)。
我的模拟涉及一个区间内的 4 个字段(它们每个都由通常包含 4000 到 16000 个元素的双精度数组表示)并且它们每次演化大约 100 万个周期,所以我们谈论的是生成的数十亿双精度。
当然,我不会每次都保存所有内容,而是使用 3 种类型的文件 (出于简短的原因,这些文件是一个模型,我的实际文件都是以 %g 格式编写的,因此它们采用这 7 个字符 + 制表符):
-
将字段内容保存在所有时间步的特定点的文件,例如:
t Phi Pi Delta A 0 1.3 0.4 0.3 0.99 ... -
在特定时间步长的所有区间内保存所有字段的文件
x Phi Pi Delta A 0 0.0 0.4 0.0 1.0 ... -
在时间和空间上每 n 步保存一次的文件
t x Phi Pi Delta A 0.0 0.0 0.0 1.3 0.0 1.0 0.0 0.1 0.01 1.2 0.02 0.98 ... 0.2 0.0 0.0 1.3 0.0 1.0 0.2 0.1 0.03 1.5 0.01 0.95
然后我将这些文件用于各种目的,例如绘制图形、对其进行傅立叶变换并使用它们来恢复模拟。
我最终需要在集群上运行它,所以我仅限于 C,目前我不知道他们是否有任何数据库/大数据系统。
我的问题是:
- 什么是存储这些数据的最佳格式,我认为它只是将双打保存为原始二进制文件,然后编写一个程序稍后检索它们,但我愿意接受建议
- 组织这些数据的最佳方式是什么?我环顾四周,也许我可以写一棵树叶是数组的树
- 压缩怎么样?
【问题讨论】:
-
将
doubles 存储为二进制文件并不是你的“灵丹妙药”。考虑0.0仅消耗 3 个字节(另外,可能是一个字节用于分隔制表符或空格)。double无论其值如何,都不断消耗 8 个字节。压缩可能会有更好的帮助。此外,它可以应用于二进制内容以及文本。 (人类可读文本的压缩通常可以实现令人印象深刻的缩减,尤其是对于大文件。) -
这只是一个例子,通常我会充分利用双精度,并保存为 %g 格式,我会用一些更真实的值来更新问题
-
这些是我在盯着您的样本时想到的可能选项: 1. 存储 delta-s 而不是绝对值。 (这可能会使指数保持在较低水平。例如,视频压缩使用 deltas 与其他技术相结合。) 2. 这假设您可以将值存储为二进制
floats 而不是doubles 而不会损失太多精度(即float- > 无论值如何,始终为 4 个字节)。您甚至可以考虑存储固定点值(又名int具有一定比例),而不是每个值甚至少于 32 位。 -
可能是,不是很认真但很容易实现:如果您将数字存储为文本(如问题所示),您只需要
0...9,.,-、E、` `(或制表符)和\n。这些是 15 个字符(可以用 4 位存储)。因此,您可以将两个字节压缩为一个 - 分别映射这些字符。 (我假设样本的标题不是必需的。)这会将文件大小至少减少一半,并且压缩/解压缩应该非常快。 :-) -
@Scheff 你最后的建议很有趣,我想知道我是否可以简单地使用纯文本,然后使用一些 hoofman 树魔法
标签: c data-structures binaryfiles