У вас есть две проблемы, касающиеся скорости ваших операций записи и чтения.
Во-первых, std :: copy не может выполнить оптимизацию блочного копирования при записи в output_iterator, поскольку он не имеет прямого доступа к базовомуtarget.
Во-вторых, вы записываете целые числа как ascii, а не как двоичное, поэтому для каждой итерации записи output_iterator создает представление ascii для вашего int, и при чтении он должен анализировать текст обратно вцелые числа.Я считаю, что это основная проблема вашей производительности.
Необработанное хранилище вашего массива (при условии 4-байтового целого) должно быть только 60 МБ, но, поскольку каждый символ целого числа в ascii равен 1 байту, любые целые числа сбольше, чем 4 символа, будет больше, чем двоичное хранилище, следовательно, ваш файл 130 МБ.
Не существует простого способа решить вашу проблему скорости переноса (чтобы файл мог быть прочитан с другим порядком байтов или числомразмер машины) или при использовании std :: copy.Самый простой способ - просто выгрузить весь массив на диск и затем прочитать его обратно, используя fstream.write и read, просто помните, что он не является строго переносимым.
Для записи:
std::fstream out(config.c_str(), ios::out | ios::binary);
out.write( keys.data(), keys.size() * sizeof(int) );
И читать:
std::fstream in(config.c_str(), ios::in | ios::binary);
in.read( keys.data(), keys.size() * sizeof(int) );
---- Обновление ----
Если вы действительно беспокоитесь о переносимости, вы можете легко использовать переносимый формат (например, ваш первоначальный ASCIIверсия) в артефактах дистрибутива, то при первом запуске программы она может преобразовать этот переносимый формат в локально оптимизированную версию для использования при последующих выполнениях.
Возможно, что-то вроде этого:
std::array<int, 15000000> keys;
// data.txt are the ascii values and data.bin is the binary version
if(!file_exists("data.bin")) {
std::ifstream in("data.txt");
std::copy(std::istream_iterator<int>(in),
std::istream_iterator<int>(), keys.begin());
in.close();
std::fstream out("data.bin", ios::out | ios::binary);
out.write( keys.data(), keys.size() * sizeof(int) );
} else {
std::fstream in("data.bin", ios::in | ios::binary);
in.read( keys.data(), keys.size() * sizeof(int) );
}
Если у вас есть процесс установки, эта предварительная обработка также может быть выполнена в это время ...