У меня есть большой файл csv (25 мб), который представляет собой симметричный граф (около 18kX18k). При анализе его на массив векторов я проанализировал код (с VS2012 ANALYZER), и он показывает, что проблема с эффективностью анализа (около 19 секунд) возникает при чтении каждого символа (getline:: basic_string:: operator + =) как показано на рисунке ниже:
Это оставляет меня расстроенным, так как с простым прошивным считыванием строк в строке и токенизатором я достигаю его менее чем за полсекунды.
В моем коде используется только библиотека STL:
int allColumns = initFirstRow(file,secondRow);
// secondRow has initialized with one value
int column = 1; // dont forget, first column is 0
VertexSet* rows = new VertexSet[allColumns];
rows[1] = secondRow;
string vertexString;
long double vertexDouble;
for (int row = 1; row < allColumns; row ++){
// dont do the last row
for (; column < allColumns; column++){
//dont do the last column
getline(file,vertexString,',');
vertexDouble = stold(vertexString);
if (vertexDouble > _TH){
rows[row].add(column);
}
}
// do the last in the column
getline(file,vertexString);
vertexDouble = stold(vertexString);
if (vertexDouble > _TH){
rows[row].add(++column);
}
column = 0;
}
initLastRow(file,rows[allColumns-1],allColumns);
init первая и последняя строка в основном делает то же самое, что и цикл выше, но initFirstRow также подсчитывает количество столбцов.
VertexSet
- это в основном вектор индексов (int). Каждая прочитанная вершина (разделенная символом ',') имеет длину не более 7 символов (значения находятся между -1 и 1).