Я пишу в библиотеке графов, которая должна читать наиболее распространенные графические форматы. Один формат содержит следующие данные:Разбор файлов быстрый способ?
e 4 3
e 2 2
e 6 2
e 3 2
e 1 2
....
и я хочу разобрать эти строки. Я посмотрел на stackoverflow и нашел neat solution, чтобы сделать это. Я в настоящее время используют подход, как это (файл является fstream):
string line;
while(getline(file, line)) {
if(!line.length()) continue; //skip empty lines
stringstream parseline = stringstream(line);
char identifier;
parseline >> identifier; //Lese das erste zeichen
if(identifier == 'e') {
int n, m;
parseline >> n;
parseline >> m;
foo(n,m) //Here i handle the input
}
}
Она работает довольно хорошо, и, как предполагалось, но сегодня, когда я тестировал его с огромным графа файлов (50 Мб +) Я был в шоке, что эта функция была безусловно, является наихудшим узким местом во всей программе:
Строковый поток, который я использую для анализа строки, использует почти 70% от общей продолжительности выполнения, а команда getline - 25%. Остальная часть программы использует только 5%.
Есть ли быстрый способ прочитать эти большие файлы, возможно, избегая медленных строк и функции getline?
Вы считали boost :: spirit? – je4d
Я хочу избежать повышения, если это возможно. – Listing
долларов в doughtnuts, что ваша библиотека C библиотеки scanf может побить все это. :) – Kaz