Каким способом лучше перерабатывать многомиллионые логи?
Доброго времени суток сообщество.
Суть задачи: еженедельно обрабатывать логи в 50кк-80кк строк.
Есть mysql база с уникальными полями в 25кк строк, со временем собираются необходимые логи и нужно обновить инфу(счётчики + дополнительные поля).
Как я сейчас это вижу:
1. Переработать логи убрав дубликаты/суммировать поля. (обычно строк где то 60% от количества строк в БД)
2. Построчно делать запросы к базе (сравнить и обновить/добавить если надо)
Но время работы скрипта растягиваются на часы + очень трудно вывести прогресс работы.
Как можно решить данную проблему? Помогите :)
Как работало раньше. Когда то база была <5кк и я сливал всё в многомерный массив, логи тоже в массиве быстро собирал, сравнивал и обновлял. Но месяц назад мне начало выдавать ошибку с нехваткой памяти, а поднять лимит нельзя, php ведь 32битный. Обновление такой базы протекало не более 2-5 минут.
уххх... Вот это ночка выдалась. Все логи записаны.
Спасибо обоим за советы. Реализовал поэтапную заливку логов с сохранением незавершённых ссесий во временной таблице. Работает на удивление быстро :)
Ну работе с базами в C++ есть много информации в интернете.
Но можно и на PHP. Основная проблема в кол-во памяти, как я понимаю?
Думаю, можно попробовать парсить логи не полностью, а по чуть-чуть.
Допустим парсим с 1 по 100000, как закончили, очищаем память и парсим с 100001 по 200000, ну и т.д.
Там много велосипедов можно придумать с SQL базами/демонами и репликациями, но все они плохо масштабируются и люто тормозят. Если есть тенденция увеличения объема логов, то нужно смотреть в сторону logstash + elastic search, иначе в будущем у вас будет такое легаси, с которым уже сложно будет что-то сделать.