2012-02-07 5 views
1

Я проектирую демона, который будет непрерывно читать строки из одного текстового файла и обрабатывать эти строки. Каков хороший общий способ отслеживания последней обработанной строки, независимо от имени файла, в случае записи строк в текстовый файл, пока демон не запущен?Лучший способ отслеживания последней строки, прочитанной в текстовом файле

Каждый раз файл архивируется, и вместо него создается новый пустой файл. Демон будет остановлен для архивации.

Моей первой идеей, которая кажется сложной, является вычисление и сохранение номера хэша и номера последней успешно обработанной записи. Затем, когда демон запускается снова, запустите этот номер строки и вычислите хеш. Если хеш совпадает, продолжайте обработку следующей записи. Если хеш не соответствует, начните сначала в файле в начале, так как это скажет, что это новый файл.

У меня возникло ощущение, что в анализаторе журналов или что-то в текстовом редакторе есть хорошая техника общего назначения, в которой у меня не было воздействия.

ответ

0

Предполагая, что у вас есть разрешение, достаточное дисковое пространство и предполагается, что вы безопасно убиваете демона ... Просто напишите последнюю строку, обработанную файлом (при завершении работы демона).

Вы можете обернуть каждый экземпляр демона внутри контекста сене, если вы хотите

из contextlib импорта contextmanager

http://docs.python.org/library/contextlib.html

class a_daemon(): 
    def __init__(self,last_line): 
     print "initilizing.." 
     self.last_line=last_line 

    def run_me(self): 
     print "running.." 
     #while true, process lines, set last_line to current line being processesed. 
     self.last_line='blah' 

from contextlib import contextmanager 

@contextmanager 
def run_new_daemon(): 
    print "getting last line" 
    last_line=open("last_line.txt").read() #you should get a "file does not exist" error the first time running this unless you created the file already 

    my_daemon=a_daemon(last_line) 
    yield my_daemon 

    print "shutting down, writing last line to file." 
    with open("last_line.txt",'w') as last_line_file: 
     last_line_file.write(my_daemon.last_line) 

with run_new_daemon() as my_daemon: 
    my_daemon.run_me() 
+0

Не могу поверить, что я думал о хэшировании, прежде чем просто хранить линию. Так просто. Тем не менее, мне интересна идея contextmanager. Что конкретно должен был использовать менеджер контекста? Я пока еще не использовал один из них. – Jeremy

+0

Я добавил некоторый пример кода, однако я не очень люблю свое решение. Надеюсь, вы все равно найдете интересный пример contextmanager. –

0

Если у вас возникнут проблемы с хранением хэша, вы можете сохранить всю строку. Это не может быть так долго. Или в любом случае, если это достаточно долго, чтобы быть проблемой, тогда это должны быть действительно огромные файлы!

В любом случае, вам необходима постоянная сохранность данных. Pickle, JSON, SQLite - все варианты, но в этом случае все они кажутся излишними. Я бы просто сохранил его в файле.

0

Я буду использовать более простой метод. Сохраните текущую позицию файла и время создания. Если время создания увеличилось, это новый файл. В противном случае начните с сохраненной позиции.

Это предполагает, что строки только добавляются или файл заменяется.

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

+0

Время создания файла было первым, о чем я думал, но я понимаю, что файловые системы linux (ext4 в этом случае) не сохраняют время создания файла? – Jeremy

Смежные вопросы