Я пишу программу, которая включает в себя анализ файлов CSV минимум 0,5 ГБ (и максимум более 20 ГБ), я прочитал из CSV следующим образом: fstream
, while (getline(fin,line)) {}
, и в среднем по 17 миллисекунгов работает с каждой записью, разделенной запятой. Простые вещи.Скорость ввода-вывода - ускорение?
Но, есть много записей. Таким образом, очевидно, что программа связана с I/O, но Мне было интересно, могу ли я улучшить производительность ввода-вывода. Я не могу прибегать к OpenMP, поскольку я бы имел дело с ограничениями процессора, и буферизация файла, это большое не будет работать. Так что мне может понадобиться какой-то трубопровод ...
У меня ОЧЕНЬ мало опыта в многопоточности на C++ и никогда не использовались фреймворки потока данных. Может ли кто-нибудь указать мне в правильном направлении?
Update (12/23/14):
Спасибо за все ваши комментарии. Вы правы, 17 мс было немного ... После выполнения профилирования (о, боли) я изолировал узкое место как итерацию по подстроке в каждой записи (75 символов). Я экспериментировал с #pragmas
, но это просто недостаточно для распараллеливания. накладные расходы на вызов функции были основной проблемой - теперь 5.41 мкс на запись, сдвинув большой блок. Это уродливо, но быстрее.
Спасибо @ ChrisWard1000 за ваши предложения. К сожалению, я не очень хорошо контролирую аппаратное обеспечение, которое я использую на данный момент, но будет профилировать с большими наборами данных (> 20 ГБ CSV) и посмотреть, как я мог бы ввести разбор массива mmap/multithreaded и т. Д.
Настройте среду профилирования, чтобы узнать, где ваши узкие места. Просто догадываясь, вы, вероятно, могли бы ускорить свою обработку, используя второй поток, потому что 17 мс - это время на полпути современного компьютера, и за это время он привязан к процессору. –
Вам определенно нужно настроить среду профилирования. Вам нужно знать, сколько времени потребуется для последовательного чтения всего файла без промежуточной обработки. Время получить данные через память, чтобы вы могли сделать что-то еще с этим, будет ограничено с такой скоростью (т. Е. Вы просто не сможете обрезать данные быстрее, чем ваши шпиндели могут доставить его). Если ваше текущее общее время значительно * больше *, чем минимальное время чтения, потенциально может быть область для улучшения путем разгрузки чтения в async-io и отправки фактической обработки в рабочий поток или пул. – WhozCraig
ОС читает заранее. Часто вызов чтения является только memcpy. Но, похоже, вам нужно доказать, что вы сначала связаны с IO. При 160 записях в секунду это не похоже на это. – usr