Обзор: после нескольких дней исследований я не смог найти быстрый и эффективный способ записи/чтения вектора в/из файла. Большинство ответов, которые я видел, связаны с нажатием/выводом каждого отдельного элемента в/из файла. Это невероятно много времени, поскольку количество элементов увеличивается. Кроме того, я не смог найти попытку ответить на мою конкретную проблему. Поэтому, пожалуйста, убедитесь, что ваше решение будет работать для моего конкретного обстоятельства (т.е. прочитайте весь вопрос).Эффективный способ чтения/записи векторов в файл
Моя проблема: у меня очень большая структура данных, содержащая пиксельные данные об изображениях. Есть 60 000 изображений с 784 пикселами каждый. Каждое изображение представляет собой изображение рукописной цифры. Таким образом, в дополнение к 60 000 * 784 пикселям, мне нужно включить ярлык, чтобы я знал, какую цифру представляет изображение. Ярлык, который я использую, который необходим при просмотре в рамках всего проекта, представляет собой вектор из 10 возможностей, представляющий 0, 1, 2 ... 9, только один из которых содержит '1'/' true ', а остальные -' 0 '/' false '. Кроме того, эта структура данных из-за требований к линейной алгебре во всей остальной части проекта требует, чтобы информация хранилась в структуре «Col», используемой в Библиотеке линейных алгебр Армадилло. Итак, структура, которую я хочу сохранить/прочитать в/из файла, объявляется как std::vector<std::vector<arma::Col<double>>>
.
Вот функция, которую я использую, чтобы сохранить данные прямо сейчас, чтобы дать контекст:
void SaveTrainingData(vector<vector<Col<double>>> trainingData) //format: trainingData[60000][2][784, 10]
{
ofstream ofile("VectorizedTrainingData.dat", ios::binary);
for (int i = 0; i < trainingData.size(); i++)
for (int j = 0; j < trainingData[i].size(); j++)
for (int k = 0; k < trainingData[i][j].size(); k++)
ofile.write((char *)&trainingData[i][j][k], sizeof(double));
}
Если у вас есть какие-либо вопросы, пожалуйста, не стесняйтесь спрашивать! Заранее спасибо.
'void SaveTrainingData (вектор <вектор >> trainingData)' Если вы не передали вектор по значению, вещи могли бы ускориться только в вызове функции. Кроме того, выполняете ли вы это с включенными оптимизациями или «отлаживаете» неоптимизированную версию вашей программы? Кроме того, обратите внимание, что дисковый ввод-вывод - это сложная задача для оптимизации в некоторых отношениях, поскольку многие из них сводятся к производительности диска. – PaulMcKenzie