序列化浮点数向量

Serialize a vector of floats

本文关键字:向量 浮点数 序列化      更新时间:2023-10-16

问题是我想在文件中保存一个2D float向量。由于我不熟悉c++,这变得很麻烦,可能的解决方法是:

  1. 将它们序列化成字符串并写入文件
  2. 将它们序列化为二进制数据并写入文件。

两种方法中哪一种在速度方面更有效?

我正在做这样的事情:

std::string serialized;
    for (int s = 0; s < (int) mfcc_features_a.size(); s++)
     {
     for (int t = 0; t < (int) mfcc_features_a[s].size(); t++){
       serialized = serialized + "|" + boost::lexical_cast<std::string>(mfcc_features_a[s][t]);
     }
     }
    std::cout << "serialized string is: " << serialized << std::endl;

存储二进制数据可能会更快一些,因为数据几乎肯定会更小。对于程序的整体性能而言,这种差异可能很重要,也可能不重要:您必须进行测量才能发现。

在c++ 03中,你的代码有一个主要的低效率。specialized = specialized + "|" + ...逐渐创建越来越长的完整数据副本,每个float值三个副本。要么使用+=,要么直接将数据写入流。在c++ 11中,你可以这样写specialized = std::move(specialized) + "|" + ...

虽然二进制的执行速度肯定更快,但它在编码和调试时可能会很麻烦,因为大多数程序员都不太理解浮点格式。在这方面,编程和执行的总时间可能会更慢。

而且,如果希望将数据移植到任何其他机器上,几乎可以肯定,将数据转换为通用可读格式是值得的。

虽然不是很像c++,但我喜欢使用sprintf例程将浮点值格式化为固定宽度字符串(24个字符)。

char *pData = new char[vec.size() * 24 + 1];
char *p = pData;
for (size_t i = 0; i < vec.size(); ++i, p += 24)
    sprintf(p, "%+.14Ern", vec(i));

// ... write pData to file ...
delete[] pData;

祝你好运!