Нам нужно читать и подсчитывать разные типы сообщений/запускать некоторые статистические данные в текстовом файле 10 ГБ, например, FIX журнал. Мы используем Linux, 32-разрядные, 4 процессора, Intel, кодирование в Perl, но язык не имеет большого значения.
Я нашел несколько интересных советов в Tim Bray Проект WideFinder. Однако мы обнаружили, что использование карт памяти по существу ограничена 32-битной архитектурой.
Мы попытались использовать несколько процессов, которые, похоже, работают быстрее, если мы параллельно обрабатываем файл, используя 4 процесса на 4 процессора. Добавление многопоточности замедляет работу, возможно из-за стоимости переключения контекста. Мы попытались изменить размер пула потоков, но это все еще медленнее, чем простая многопроцессорная версия.
Часть отображения памяти не очень стабильна, иногда она занимает 80 секунд, а иногда и 7 секунд в файле размером 2 ГБ, возможно, из страниц или что-то, что связано с использованием виртуальной памяти. Во всяком случае, Mmap не может масштабироваться за пределы 4 ГБ на 32-битной архитектура.
Мы попробовали Perl IPC:: Mmap и Sys::Mmap. Смотрел в Map-Reduce также, но проблема в самом деле - I/O связанный, сама обработка достаточно быстро.
Итак, мы решили попробовать оптимизировать базовый ввод-вывод, настроив размер буфера, тип и т.д.
Может ли кто-нибудь, кто знает о существующем проекте, где это проблема была эффективно решена на любом языке/платформе указать на полезную ссылку или предложить направление?