Я разбираю большой файл 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
?
Как вы узнали/убедитесь, что несжатый вход не был буферизирован в кэш-памяти ОС файловой системы перед его обработкой? Это может легко скрыть накладные расходы ввода-вывода диска. Также возможно, что ввод «читается вперед» эффективно в фоновом режиме одновременно с вашим синтаксическим анализом, так что во времени есть больше данных; они не могут ожидать, что они просто добавятся вместе. –
Ваши результаты просто указывают на то, что диск IO не является узким местом, но, вероятно, алгоритмом CPU/parser. – JimmyB
Если вы считаете, что замена файловой системы на ресурс памяти может привести к любым улучшениям производительности, то я бы посоветовал вам больше узнать о сегодняшних операционных системах, потому что это могло произойти не ранее 20 лет назад. Сегодня ОС балансирует использование физических фс и памяти по своему усмотрению, и они не имеют ничего общего с использованием программой памяти (программы alloc/dealloc) и fs (с использованием имен файлов, чтения/записи и т. Д.). Может случиться, что использование mem вместо fs может привести к увеличению использования ... fs (по ОС) из-за замены. Файлы OTOH также «кэшируются» в памяти. – Ethouris