У меня есть 1000-строчный файл размером около 400 МБ, представляющий некоторые числовые данные, представленные в виде строки. Я хочу транспонировать данные, чтобы в каждой строке было только 1000 строк (чтобы я мог открыть их и быстро построить с помощью панд).
Я импортировал весь файл в векторе вектора строки, которыйЯ хочу транспонировать (и, в конце концов, я хочу записать обратно в файл).
Я использую два вложенных цикла для прохождения 2d-структуры и записываю их в некоторый std :: ofstream. Это очень долго. Затем я попытался сосредоточиться на транспонировании и написал следующий код:
//Read 400MB file, 90K strings per line and 1K lines, and store it into
std::vector<std::vector<std::string>> mData;
// ...
// IO the file and populate mData with raw data
// ...
//All rows have same number of string
size_t nbRows = mData.size();
size_t nbCols = mData[0].size();
std::vector<std::vector<std::string> > transposedData(nbCols);
for(size_t i = 0 ; i < nbCols ; ++i)
{
transposedData[i].resize(nbRows);
for(size_t j = 0 ; j < nbRows ; ++j)
{
transposedData[i][j] = doc.mData[j][i];
}
}
Я думал, что нескольких секунд будет достаточно, но это займет несколько минут. Кроме того, я пытаюсь с различными входными размерами (только 3 строки и намного больше строк на строку, для того же размера файла 400 МБ), и это намного быстрее.
РЕДАКТИРОВАТЬ 1
По советам людейЯ выполнил профилирование с помощью callgrind. Я получил это сообщение во время процесса: ... переполнение сегмента brk в потоке # 1: невозможно увеличить до ...
Я проанализировал результат и суммировал его здесь:
25% потрачено вoperator = of basic_string
21% тратится на построение basic_string (с новым временем только 3%)
14% тратится в operator () [] на внешнем векторе
11% тратится наoperator () [] на внутреннем векторе
Спасибо за ваши предложения.