C 用于大型数据集的高效输出格式?

C 用于大型数据集的高效输出格式?,c,file,file-writing,data-handling,C,File,File Writing,Data Handling,我编写了一个程序,将输出写入文件。输出为6列n行格式,所有值均为双精度浮点值。在我的代码中,n变得非常大(1e20左右)是很常见的,因此,输出数据文件也变得非常大 我目前以*.csv格式存储所有内容,这显然会产生巨大的数据文件。有没有更有效的方法来存储这些值?是否有任何新的文件格式或新的方法可以显著减小文件大小 请澄清: 数据不需要是人类可读的,二进制就可以了。 我将进一步处理文件中的数据,以从运行中获得一些重要参数,可能是行程距离、特定点的退出时间等。 该代码实际上是对运动粒子的天体物理模拟,

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

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

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

< P>当设计一个文件格式时,你必须考虑各种各样的东西,如:

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\u row\u data[index[n]]
”)。

您能更具体一点吗?格式必须是人类可读的,还是二进制文件可以?您想对文件中的数据做什么?请将您的问题添加到更多信息中,而不是在注释中回答。这些数据文件是否将被其他程序(如Excel)使用?如果是这样,.csv可能是您最好的选择。你能用zip或gzip压缩文件以便长期存储吗?为了提高文章的可读性,我对你的文章进行了一些语法和格式上的小改动。希望这也会增加其影响。
在我的代码中,n变得非常大(1e20左右)是很常见的。
1e20行文本数据?每行只有10字节,即一百万PB。