|
|
|
| Обработка файла access_log. Нужен совет
Цель: за указанный временной интервал (далее, «вх_ интервал) посчитать количество обращений и «размер ответа сервера» к IT-ресурсу для выбранного IP (параметр %a) или URI (параметр %r).
Проблемы очевидны: очень большой размер файла access_log и время обработки при построчном переборе.
Пояснения: границы временного интервала (далее, «низ», «верх») соответствуют формату даты в строке access_log (dd/mmm/gggg) и необходимо выбрать все строки соответствующие заданным критериям и от 00:00:00 начала интервала до23:59:59 конца интервала.
Для решения хочу использовать принцип поиска «решение теоремы о вложенных отрезках», т.е. начало и конец лог-файла - это некий отрезок.
«грубый прогон»
1. делю отрезок пополам и запоминаю координаты (смещения) начала, конца каждого полученного отрезка (при первом проходе длина файла пополам – смещение к средине файла)
2. fseek() выхожу на нужную позицию (полученную в пункте 1)
3. читаю фрагмент некой длины (например, 1024 байта) с позиции полученной в п.2
4. регуляркой нахожу «цельную строку access_log» высчитываю смещение от начала прочитанного фрагмента до «строки access_log» получаю точную координату обрабатываемого отрезка,
5. проверяю дата в access_log-строке больше (для возни с низом) нижней границы или меньше (для возни с верхом) вх_интервала. Если БОЛЬШЕ беру левый фрагмент (для низов) или беру правый (для верхов) и иду (=>) на пункт 1, если МЕНЬШЕ беру правый (для низов) или беру левый (для верхов) и => 1. если РАВНЫ даты => 6
«тонкий прогон»
6. перебираю строки (построчно левую границу отрезка перевожу ближе к началу файла (для низов) или построчно правую границу перевожу ближе к концу файла (для верхов)) с указанной даты и нахожу смещение к самой крайней строке за указанную дату. Затем => 7.
7. Если необработанны «верхи», то переопределяю границы отрезка. Правая координата – результат работы пункта 6. Левая – конец файла. Затем =>1. Если обработаны «верхи», то => 8 .
8. Считываем кусок лог-файла по полученным критерием, где начальное смещение – смещение полученное при обработке «низов», длина – разность (смещение_низ – смещение_верх), преобразуем в массив. А дальше все просто, как мне кажется.
Что посоветуете? Может как-то проще можно решить мою проблему? | |
|
|