用于在文件格式中存储变量的字符串与二进制文件
Strings vs binary for storing variables inside the file format
我们的目标是使用 HDF5 作为我们的数据格式。之所以选择HDF5,是因为它是一种类似分层文件系统的跨平台数据格式,支持海量数据。
该文件将包含数组和一些参数。问题是关于如何存储参数(这些参数不是由大量数据组成的),还要考虑 文件版本控制问题 和构建库的努力。 HDF5 内部的参数可以存储为 (A) 人类可读的 attribute/value 对或 (B) HDF5 复合数据类型形式的二进制数据。
举个例子,让我们考虑一个具有三个顶点的多边形作为参数。在情况 A 下,我们可以有一个名为 Polygon
的变量,其中包含顶点系列的字符串表示形式,例如例如 (1, 2); (3, 4); (4, 1)
。在情况 B 下,我们可以取而代之的是一个名为 Polygon
的变量,该变量由 [2 x 3] 矩阵组成。
我们有一些想法,但如果能得到已经使用过类似东西的人的意见就更好了。更准确地说,您能否列出 pro/cons A 和 B,并说明在什么情况下哪个更可取?
如果您希望经常手动编辑文件(如 XML 或 JSON),请使用人类可读的格式。
否则使用二进制 - 为它创建解析器要容易得多,而且它 运行 比任何语法解析器都快。
另请注意,没有什么可以阻止您稍后创建二进制和人类可读形式之间的转换器。
版本控制文件听起来不错,但您真的要检查文件的差异吗"containing large arrays"?
作为一个不得不多次完全按照您所说的去做的人,rr 基本上是正确的,但我会稍微改变重点。
- 对于文件版本控制,文本基本上是赢家。
- 由于您使用的是 hdf5 库,我假设序列化和解析都是等效的人工操作。
- 文本文件更便于携带。您可以以最小的风险跨代硬件传输文件。
文本文件更易于人类使用。如果你想提取数据的一个子集并对其进行操作,你可以在多台计算机上使用许多程序来完成。如果您正在处理二进制数据,您将需要一个允许您这样做的程序。根据您如何看待人们使用您的数据,这会对数据的可访问性和维护成本产生巨大影响。您将能够 sed、grep,甚至编辑 excel.
中的数据
二进制数据(对于大型数据集)的输入和输出将比文本快得多。
- 在新的环境中使用这些二进制文件(例如在未来的某些科幻小说中使用 128 位小端计算机)将需要一些工程。
- 同样,如果您使用其他语言编写应用程序,则需要在应用程序之间以相同的方式处理编码。这要么意味着工程工作,要么在所有平台上都提供相同的库。纯文本这样更容易...
- 如果您希望其他人编写使用您的数据的应用程序,纯文本更简单。如果您提供二进制文件,则必须提供它们可以遵循的文件规范。使用纯文本,任何人都可以查看文件并弄清楚如何解析它。
- 您可以压缩压缩文本文件,因此 space 主要是您正在使用的数据的问题。
- 调试二进制数据存储比调试纯文本存储要多得多。
所以最后这在一定程度上取决于您的用例。在处理纯文本的无数工具中查看数据是否有意义?是不是只有用大数据hdf5查看器看才有意义?就时间和 space 而言,编写纯文本对您来说会很麻烦吗?
一般来说,当我遇到这个问题时,我基本上总是做同样的事情:我以纯文本形式存储数据,直到我意识到速度问题比使用二进制文件更令人恼火,然后我切换。如果您事先不知道您是否超过了该阈值,请从纯文本开始,然后将您的界面写入您的持久层,以便以后可以轻松切换。这是一点额外的工作,由于纯文本更易于调试,您可能会收回这些工作。
我们的目标是使用 HDF5 作为我们的数据格式。之所以选择HDF5,是因为它是一种类似分层文件系统的跨平台数据格式,支持海量数据。
该文件将包含数组和一些参数。问题是关于如何存储参数(这些参数不是由大量数据组成的),还要考虑 文件版本控制问题 和构建库的努力。 HDF5 内部的参数可以存储为 (A) 人类可读的 attribute/value 对或 (B) HDF5 复合数据类型形式的二进制数据。
举个例子,让我们考虑一个具有三个顶点的多边形作为参数。在情况 A 下,我们可以有一个名为 Polygon
的变量,其中包含顶点系列的字符串表示形式,例如例如 (1, 2); (3, 4); (4, 1)
。在情况 B 下,我们可以取而代之的是一个名为 Polygon
的变量,该变量由 [2 x 3] 矩阵组成。
我们有一些想法,但如果能得到已经使用过类似东西的人的意见就更好了。更准确地说,您能否列出 pro/cons A 和 B,并说明在什么情况下哪个更可取?
如果您希望经常手动编辑文件(如 XML 或 JSON),请使用人类可读的格式。
否则使用二进制 - 为它创建解析器要容易得多,而且它 运行 比任何语法解析器都快。
另请注意,没有什么可以阻止您稍后创建二进制和人类可读形式之间的转换器。
版本控制文件听起来不错,但您真的要检查文件的差异吗"containing large arrays"?
作为一个不得不多次完全按照您所说的去做的人,rr 基本上是正确的,但我会稍微改变重点。
- 对于文件版本控制,文本基本上是赢家。
- 由于您使用的是 hdf5 库,我假设序列化和解析都是等效的人工操作。
- 文本文件更便于携带。您可以以最小的风险跨代硬件传输文件。
文本文件更易于人类使用。如果你想提取数据的一个子集并对其进行操作,你可以在多台计算机上使用许多程序来完成。如果您正在处理二进制数据,您将需要一个允许您这样做的程序。根据您如何看待人们使用您的数据,这会对数据的可访问性和维护成本产生巨大影响。您将能够 sed、grep,甚至编辑 excel.
中的数据
二进制数据(对于大型数据集)的输入和输出将比文本快得多。
- 在新的环境中使用这些二进制文件(例如在未来的某些科幻小说中使用 128 位小端计算机)将需要一些工程。
- 同样,如果您使用其他语言编写应用程序,则需要在应用程序之间以相同的方式处理编码。这要么意味着工程工作,要么在所有平台上都提供相同的库。纯文本这样更容易...
- 如果您希望其他人编写使用您的数据的应用程序,纯文本更简单。如果您提供二进制文件,则必须提供它们可以遵循的文件规范。使用纯文本,任何人都可以查看文件并弄清楚如何解析它。
- 您可以压缩压缩文本文件,因此 space 主要是您正在使用的数据的问题。
- 调试二进制数据存储比调试纯文本存储要多得多。
所以最后这在一定程度上取决于您的用例。在处理纯文本的无数工具中查看数据是否有意义?是不是只有用大数据hdf5查看器看才有意义?就时间和 space 而言,编写纯文本对您来说会很麻烦吗?
一般来说,当我遇到这个问题时,我基本上总是做同样的事情:我以纯文本形式存储数据,直到我意识到速度问题比使用二进制文件更令人恼火,然后我切换。如果您事先不知道您是否超过了该阈值,请从纯文本开始,然后将您的界面写入您的持久层,以便以后可以轻松切换。这是一点额外的工作,由于纯文本更易于调试,您可能会收回这些工作。