【问题标题】:Strings vs binary for storing variables inside the file format用于在文件格式中存储变量的字符串与二进制文件
【发布时间】:2015-09-07 20:54:52
【问题描述】:

我们的目标是使用 HDF5 作为我们的数据格式。之所以选择 HDF5,是因为它是一种类似分层文件系统的跨平台数据格式,并且支持大量数据。

该文件将包含数组和一些参数。问题是如何存储参数(不是由大量数据组成),还要考虑文件版本控制问题和构建库的努力。 HDF5 中的参数可以存储为 (A) 人类可读的属性/值对或 (B) HDF5 复合数据类型形式的二进制数据。

作为一个例子,让我们考虑一个具有三个顶点的多边形作为参数。例如,在情况 A 下,我们可以有一个名为 Polygon 的变量,其中包含一系列顶点的字符串表示,例如例如(1, 2); (3, 4); (4, 1)。在情况 B 下,我们可以改用一个名为 Polygon 的变量,该变量由 [2 x 3] 矩阵组成。

我们有一些想法,但如果有已经从事过类似工作的人提供意见,那就太好了。更准确地说,您能否列出 A 和 B 的优缺点,并说明在什么情况下哪个更可取?

【问题讨论】:

  • what you would vote for 使问题主要基于意见,这是关闭 SO 的原因。
  • 我会说明你所说的“大量数据”是什么意思。
  • 谢谢罗宾逊。我已经更新了参数并不大

标签: c++ file hdf5 dataformat


【解决方案1】:

如果您希望经常手动编辑文件(如 XML 或 JSON),那么请使用人类可读的格式。

否则使用二进制文件 - 为它创建解析器要容易得多,并且运行速度比任何语法解析器都要快。

还要注意,没有什么可以阻止您稍后在二进制和人类可读形式之间创建转换器。

版本控制文件可能听起来不错,但您真的要检查“包含大型数组”的文件的差异吗?

【讨论】:

  • 感谢您的意见!版本控制主要影响参数,我计划使用 HDF5 对象的属性来了解版本,从而了解正确的阅读方式
【解决方案2】:

作为一个不得不多次执行您所说的事情的人,rr 基本上是正确的,但我会稍微改变一下重点。

  • 对于文件版本控制,文本基本上是赢家。
  • 由于您使用的是 hdf5 库,我假设序列化和解析都是等效的人工操作。
  • 文本文件更便携。您可以以最小的风险跨代硬件传输文件。
  • 文本文件更易于人类使用。如果您想提取数据的子集并对其进行操作,您可以使用多台计算机上的许多程序来实现。如果您正在处理二进制数据,您将需要一个允许您这样做的程序。根据您如何看待人们使用您的数据,这可能会对数据的可访问性和维护成本产生巨大影响。您将能够 sed、grep 甚至在 excel 中编辑数据。

  • 二进制数据的输入和输出(对于大型数据集)将比文本快得多。

  • 在新环境中处理这些二进制文件(例如,未来科幻小说中的 128 位小端计算机)需要一些工程设计。
  • 类似地,如果您使用其他语言编写应用程序,则需要在应用程序之间以相同的方式处理编码。这要么意味着工程工作,要么意味着在所有平台上都可以使用相同的库。纯文本这更容易......
  • 如果您希望其他人编写使用您的数据的应用程序,纯文本会更简单。如果您提供二进制文件,则必须提供他们可以遵循的文件规范。使用纯文本,任何人都可以查看文件并弄清楚如何解析它。
  • 您可以通过压缩归档文本文件,因此空间问题主要是您正在使用的数据的一个问题。
  • 调试二进制数据存储比调试纯文本存储要多得多。

所以最终它在一定程度上取决于您的用例。查看处理纯文本的无数工具中的数据是否有意义?只有用大数据hdf5查看器看才有意义吗?写纯文本会不会很费时间和空间?

一般来说,当我遇到这个问题时,我基本上总是做同样的事情:我将数据存储为纯文本,直到我意识到速度问题比使用二进制文件更烦人,然后我切换.如果您事先不知道是否超过了该阈值,请从纯文本开始,然后将接口写入持久层,以便以后轻松切换。这是一点点额外的工作,由于纯文本更容易调试,您可能会得到回报。

【讨论】:

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