2015-02-04 2 views
0

Я разбираю большой файл CSV (~ 450 МБ). Анализатор основан на ifstream и getline. Это работает очень хорошо, но занимает некоторое время. Чтобы сократить время, я попытался прочитать сжатую версию файла CSV (~ 21 МБ) в istringstream и использовать тот же синтаксический анализатор. Тем не менее, парсер занимает одинаковое время при использовании ifstream или istringstream. По моему мнению, парсер должен быть быстрее, когда используется istringstream, потому что контент уже буферизирован в памяти.Ошибка производительности с помощью istringstream

Вот некоторые псевдо-код:

ifstream file(filename) 
istream* filePointer = &file 
if(gz file) { 
    read file into string 
    decompress string 
    create istringstream from decompressed string 
    set filePointer to istringstream 
} 
parse(filePointer) 
--- 
void parse(istream* file) { 
    // ... 
    while(getline(*file, line)) { 
     // ... 
    } 
} 

Результаты деятельности:

  • несжатый
    • анализатор: 15 с (ifstream)
  • сжимаются
    • файл для чтения и распаковка: 4 с
    • анализатор: 15 с (istringstream)

Это нормальное поведение, что istringstream не быстрее, чем чтение и разбор файла одновременно с использованием ifstream?

+1

Как вы узнали/убедитесь, что несжатый вход не был буферизирован в кэш-памяти ОС файловой системы перед его обработкой? Это может легко скрыть накладные расходы ввода-вывода диска. Также возможно, что ввод «читается вперед» эффективно в фоновом режиме одновременно с вашим синтаксическим анализом, так что во времени есть больше данных; они не могут ожидать, что они просто добавятся вместе. –

+3

Ваши результаты просто указывают на то, что диск IO не является узким местом, но, вероятно, алгоритмом CPU/parser. – JimmyB

+0

Если вы считаете, что замена файловой системы на ресурс памяти может привести к любым улучшениям производительности, то я бы посоветовал вам больше узнать о сегодняшних операционных системах, потому что это могло произойти не ранее 20 лет назад. Сегодня ОС балансирует использование физических фс и памяти по своему усмотрению, и они не имеют ничего общего с использованием программой памяти (программы alloc/dealloc) и fs (с использованием имен файлов, чтения/записи и т. Д.). Может случиться, что использование mem вместо fs может привести к увеличению использования ... fs (по ОС) из-за замены. Файлы OTOH также «кэшируются» в памяти. – Ethouris

ответ

0

Как вы указали в результатах своей работы, время синтаксического анализа является постоянным, и оба метода считывают файл быстрее, чем он обрабатывается. Таким образом, узкое место в скорости - это синтаксический анализ, и чтение файла быстрее, не поможет в производительности. Если вы хотите еще больше оптимизировать свой код, вам нужно что-то сделать для синтаксического анализатора.