我需要从计算中写入一些数据,稍后将由 Paraview(.vtu 或 vtk 文件)读取。
谈到文件大小,我应该选择 ASCII 格式还是二进制格式?
我需要从计算中写入一些数据,稍后将由 Paraview(.vtu 或 vtk 文件)读取。
谈到文件大小,我应该选择 ASCII 格式还是二进制格式?
如果您唯一担心的是文件大小,那么您需要二进制文件。作为一个说明性示例,假设您正在将 1 个双精度浮点数写入文件。让我们假设文件系统可以完美地处理这个问题,并且保存文件、标题和填充都是 0。
对于二进制文件,该数字将采用 RAM 中数字的确切大小,即 8 个字节。
在 ASCII 格式中,它将包含:
假设一个字符只使用 1 个字节,即 22 个字节来保存相同的数字。这不计算在数字之间进行分隔所需的字符(通常至少为 1)。因此 ASCII 格式的文件大小大约会大 3 倍。
您可以用文件大小换取存储文件的精度(在基数中仅保留 5-6 位),但这取决于您使用它们的目的。ASCII 的主要优点是用于调试或生成人类可读的数据。
在实践中,您很少需要比 3 个有效数字更准确的可视化文件中的数据。在这种情况下,ASCII——也许令人惊讶——通常比二进制形式更紧凑。如果您正在考虑存档,那么对这些 ASCII 文件进行 bzip 压缩可能会产生您可以获得的最小文件。
也就是说,Paraview 读取具有压缩二进制形式的 VTU 格式(基于 XML,但数据首先经过 libz 压缩,然后再次 uuencoded 以产生 ASCII 文本)。在典型文件上,这可以节省 4-10 倍。对于大文件,这绝对是要走的路。
tl;dr -将文件存储在 utf8 中。如果它是表格的,请使用制表符分隔的值。
在我看来,正确的选择是:
ASAICT 二进制文件的唯一真正优势是性能。将内存转储加载到内存中比在输出时生成文本或在输入时解析它要快得多。
或者在这里:https ://auth0.com/blog/beating-json-performance-with-protobuf/ (这不科学,并且正在讨论整体性能,最大的区别在于传输的数据量和解析时间一个偏向于文本数据的案例。)
二进制文件格式正确支持 unicode 文本的可能性很小,因此如果您关心数据完整性,请不要使用 binary。你也听说过字节序问题吗?有符号整数和浮点数的不同二进制表示?
-100000 和 -1e+6 的文本表示不会根据您的 CPU 更改值(无论如何,在 utf-8 和 ASCII 中)。
理解二进制文件的程序在 50 年后仍能理解或运行的可能性是未知的,可能不太好。如果您关心长寿,请不要使用 binary。
从另一个程序读取二进制数据通常很困难,因此如果您关心互操作性,请不要使用 binary。
旁白:CSV 是一种糟糕的文件格式。它很简单,但定义不明确,需要有状态的解析器。不要使用 CSV。如果必须,请使用 TSV。它更简单但定义更好,解析起来也很简单。
https://chriswarrick.com/blog/2017/04/07/csv-is-not-a-standard/
https://www.cloudbakers.com/blog/everything-you-didnt-want-to-have-to-know-about-csv
如果您担心大小,请压缩.
(我来这里是为了研究压缩二进制表示与压缩文本的相对大小效率。除了这项关于 VRML 的研究之外,我还没有找到好的信息,但我什至不确定它是否是 base64 编码的比较二进制与二进制。https://www.cs.unc.edu/~isenburg/papers/is-bcraf-03.pdf。)