【问题标题】:Efficient Output Format for Huge Data Sets?大型数据集的高效输出格式?
【发布时间】:2019-10-08 12:36:47
【问题描述】:

我编写了一个将输出写入文件的程序。输出为 6 列 n 行格式,所有值均为双精度浮点数。在我的代码中,n 变得非常大(1e20 左右)是很常见的,因此,输出数据文件也变得非常大。

我目前以 *.csv 格式存储所有内容,这显然会产生巨大的数据文件。有没有更有效的方法来存储这些值?任何新的文件格式或任何可以显着减小文件大小的新方法?

为了澄清: 数据不需要是人类可读的,二进制就可以了。 我将进一步处理文件中的数据以从运行中获取一些重要参数,可能是行驶距离、特定点的退出时间等。 该代码实际上是对运动粒子的天体物理模拟,对于大约 1e10 个粒子,每个粒子有 100 万个时间步长,它的大小非常高。

【问题讨论】:

  • 你能再具体一点吗?格式必须是人类可读的,还是二进制的?
  • 你想对文件中的数据做什么?请edit您的问题添加更多信息,而不是在 cmets 中回答。
  • 这些数据文件会被 Excel 等其他程序使用吗?如果是这样,.csv 可能是您的最佳选择。您可以使用 zip 或 gzip 压缩文件以进行长期存储吗?
  • 我对您的帖子进行了一些小的语法和格式更改,以提高其可读性。希望这也会增加其影响。
  • It is very common in my code for n to become extremely large (1e20 or so) 1e20 行文本数据?每行只有 10 个字节,即 100 万 PB。

标签: c file file-writing data-handling


【解决方案1】:

在设计文件格式时,您必须考虑各种因素,例如:

a) 文件是否有可能已损坏或被恶意篡改(或是否有任何保密要求)?对此的答案几乎总是“是”。为了防止这些事情发生,您需要考虑某种校验和和/或加密。您可能还需要考虑是否需要部分恢复(例如,将文件拆分为多个块/部分是否有益,其中每个块都有自己的校验和/加密,这样如果一个块/部分中的 4 个字节被损坏,您仍然可以恢复大部分数据)。

b) 是否存在可移植性问题?例如,如果您在文件中存储原始 double 值,是否会在其他具有不同二进制格式“double”的计算机上产生问题?

c) 对于每种类型的值;实际需要表示的范围是多少,精度要求是多少?通常,软件使用比必要的“更大更精确”(通常是因为它可以更快地选择 CPU 支持的下一个最大类型);但是对于文件格式,这会导致文件大小不必要的增加。举个简单的例子;也许您可以将(64 位)double 转换为 32 位定点格式,并将使用的空间减半,同时仍能达到实际需要的范围和精度。

d) 是否有“聪明”的方法来减少某些值所需的范围和精度?举个简单的例子;也许你有“起始值”和“结束值”,它们都需要 64 位;但是您可以将其转换为“起始值”和“差异”(以便“结束值”可以计算为“起始值 + 差异”),其中“差异”值的范围较小,只需要 32 位来存储。

e) 任何类型的索引都有好处吗?举个简单的例子;如果文件可能包含 100 万个条目,而您只想找到一个,那么您可以使用索引来找到所需条目的偏移量,并且只加载该条目(并避免加载所有 100 万个条目)。

f) 您还需要哪些其他元数据?这可以是“魔术签名”(以便软件可以检查文件是否应该符合文件格式并且用户没有给您的程序提供错误的文件类型),“文件格式版本号” (以便程序可以“自动更新到新的文件格式”或至少检测文件何时使用不再支持的过时/不推荐的文件格式)。它还可以包括用于识别诸如作者是谁、数据来自何处、何时获取数据、哪个程序创建/准备文件等信息。有时还有可选数据和标志来说明是否可选数据是/不包含在文件中。您可能还需要“条目数”和“每个不同区域的文件偏移量”等内容。

g) 您需要为可扩展性(以及向后兼容性和向前兼容性)做出什么样的考虑?通常,人们会在标题中保留(例如)“保留以备将来使用”字段,以便他们将来可以添加/更改/扩展文件格式而不会破坏所有内容。有时,这甚至更具体地说明当软件在它不支持的保留字段中看到值时应该做什么 - 例如“保留供将来使用,应为零,如果非零软件应忽略此值”与“保留供将来使用,应为零,如果非零(由于将来使用)软件应生成错误且不使用文件”

h) 任何类型的压缩技术有用吗?举个简单的例子,如果你有一个带有索引的“6 列,N 行”,有时 2 行或更多行的数据恰好是相同的;那么也许你只能为这些行存储一个数据副本,然后使用索引来确定哪一行使用了哪些数据(有点像“row[n] = unique_row_data[ index[n] ]”)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多