【问题标题】:Binary version of CSVCSV 的二进制版本
【发布时间】:2015-07-19 04:32:42
【问题描述】:

我想询问一种便于数据记录的文件格式。

比如我要记录轨迹数据,数据会是这样的。

t, x, y, z
0.001, 0.1, 0.2, 0.3
0.002, 0.11, 0.19, 0.31
0.003, 0.13, 0.16, 0.35

其实我查了一下文件格式,发现上面的文件格式叫做csv(Comma Separated Values)

由于 csv 将数据记录为纯文本,因此数据很容易被人类阅读。

但有时需要长数字来记录数据(即 15931548831、1248.128657)。

而且需要的长数字越多,写入文件所需的时间就越多。

因此,我需要满足以下条件的文件格式。

  • 数据应该或可以以纯二进制形式记录
  • 元数据(即数据名称、记录日期)应包含在文件中。

你认识任何人吗?

谢谢。

【问题讨论】:

  • protobuf 似乎是一个很明显的选择。如果性能不是那么重要并且您主要记录数字,则使用 BSON。
  • CSV 绝对不是存储二进制数据的正确起点。
  • @BenjaminGruenbaum,谢谢。我会检查protobuf。就我而言,代码以 1kHz~ 运行,因此性能至关重要。
  • @tangrs 是的。我只是想说我碰巧知道我使用过 CSV。 :D

标签: csv file-format


【解决方案1】:

您正在寻找Scientific data exchange format,因为这类数据是计算科学的典型数据。

您当然希望采用文件标准,因为 CSV 很受欢迎,因为它可以使用许多不同的工具进行读写。 HDF5 file format 是一种流行的选择。存在适用于任何流行编程语言的 HDF5 库。 HDF5 在存储(许多 n 维)表和相关元数据方面表现特别出色。

另一种典型的选择是序列化为二进制浮点数。在 C++ 中,这将被归档为(来源:a C++ forum

#include <iostream>
#include <fstream>

int main()
{
  float f1 = -187.33667, f2 = 0.0;
  std::ofstream out("test.bin",std::ios_base::binary);
  if(out.good())
  {
    std::cout << "Writing floating point number: " << std::fixed << f1 << std::endl;
    out.write((char *)&f1,sizeof(float));
    out.close();
  }
  std::ifstream in("test.bin",std::ios_base::binary);
  if(in.good())
  {
    in.read((char *)&f2,sizeof(float));
    std::cout << "Reading floating point number: " << std::fixed << f2 << std::endl;
  }
  return 0;
}

在这个特定的例子中,真正的二进制数据被写入:

$ hexdump test.bin 
0000000 5630 c33b                              

如您所见,该文件需要 4 个字节 的存储空间,而不是存储 ASCII 字符 -187.33667 时需要的 11 个字节(11 个字符)。使用这个概念(自定义读取器和写入器),您还可以有效地存储数字表,当然这就是 HDF5 等文件格式的工作原理。

有一些科学代码可以实现这样的自定义文件格式,但我强烈反对采用自定义文件格式,因为它们容易出错、难以调试、检查并且在编写工具方面很耗时。

【讨论】:

    猜你喜欢
    • 2016-05-06
    • 2019-03-01
    • 2016-01-14
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多