Сериализация вектора поплавков

Проблема в том, что я хочу сохранить 2D-вектор с плавающей точкой в ​​файле. так как я не знаком с 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;

0

Решение

Хранение двоичных данных может быть несколько быстрее, поскольку данные почти наверняка будут меньше. Разница может быть, а может и не быть существенной для общей эффективности вашей программы: вам нужно измерить, чтобы узнать.

В C ++ 03 ваш код неэффективен. specialized = specialized + "|" + ... постепенно создает все более и более длинные копии полных данных, по три копии на значение с плавающей запятой. Либо использовать +=или записать данные непосредственно в поток. В C ++ 11 вы можете решить это, написав specialized = std::move(specialized) + "|" + ...

2

Другие решения

Хотя двоичный файл, несомненно, будет быстрее выполняться, он может быть проблематичным для кодирования и отладки, так как большинство программистов плохо понимают форматы с плавающей запятой. В этом отношении общее время программирования и выполнения может быть медленнее.

Кроме того, если требуется перенос данных на любой другой компьютер, почти наверняка стоит преобразовать его в универсально читаемый формат.

1

Хотя не очень 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, "%+.14E\r\n", vec(i));// ... write pData to file ...

delete[] pData;

Удачи!

0
По вопросам рекламы [email protected]