Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Обработка файла access_log. Посоветуйте оптимальный алгоритм
 
 автор: vitali   (04.12.2008 в 14:45)   письмо автору
 
 

Обработка файла 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. Считываем кусок лог-файла по полученным критерием, где начальное смещение – смещение полученное при обработке «низов», длина – разность (смещение_низ – смещение_верх), преобразуем в массив. А дальше все просто, как мне кажется.

Что посоветуете? Может как-то проще можно решить мою проблему?

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования