Python: чтение новой информации, добавленной в массивные файлы - PullRequest
1 голос
/ 29 ноября 2011

Я работаю над скриптом Python для анализа файлов журнала Squid (http://www.squid -cache.org /).В то время как журналы чередуются каждый день, чтобы они не становились большими, к концу каждого дня они достигают 40-90 МБ.

По сути, я занимаюсь чтением файла построчно, анализируянеобходимые мне данные (IP, запрашиваемый URL, время) и добавление их в базу данных sqlite.Однако, похоже, это занимает очень много времени (сейчас он работает более 20 минут)

Итак, очевидно, что перечитать файл невозможно.Что я хотел бы сделать, это прочитать файл, а затем обнаружить все новые записанные строки.Или, что еще лучше, в начале дня сценарий будет просто считывать данные в режиме реального времени по мере их добавления, чтобы никогда не было длительного времени обработки.

Как мне поступить так?

Ответы [ 2 ]

2 голосов
/ 29 ноября 2011

Одним из способов достижения этого является эмуляция tail -f. Сценарий будет постоянно отслеживать файл и обрабатывать каждую новую строку в том виде, в котором она отображается.

Обсуждение и некоторые рецепты см. В tail -f на python без времени. Sleep

0 голосов
/ 29 ноября 2011

Один из способов сделать это - использовать мониторинг файловой системы с py-inotify http://pyinotify.sourceforge.net/ - и установить функцию обратного вызова, которая будет выполняться всякий раз, когда размер файла журнала изменился.

Другой способ сделать это, не требуя внешних модулей, - это запись в файловой системе. (возможно, в вашей базе данных sqlite), смещение конца последней строки, прочитанной в файле журнала (которую вы получаете с помощью file.tell()), и просто прочитайте недавно добавленные строки от этого смещения и далее, что делается простым вызовом file.seek(offset) перед циклом по линиям.

Основное отличие отслеживания смещения и эмуляции «хвоста», описанных в другом посте, заключается в том, что этот позволяет запускать ваш скрипт несколько раз, т. Е. Нет необходимости непрерывно запускать или восстанавливать в случае аварии.

...