2012-02-07 3 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

줄을 저장하기 전에 해싱을 생각했다고 생각할 수 없습니다. 매우 간단합니다. 컨텍스트 관리자에 대한 아이디어가 궁금합니다. 컨텍스트 관리자는 정확히 무엇을 사용합니까? 아직 그 중 하나를 실제로 사용하지 않았습니다. – Jeremy

+0

몇 가지 예제 코드를 추가했지만, 특히 내 솔루션이 마음에 들지 않았습니다. 어쨌든 당신은 contextmanager 예제가 모두 똑같이 흥미로워지기를 바랍니다. –

0

해시를 저장하는 데 문제가 있으면 전체 라인을 저장할 수도 있습니다. 그렇게 오래있을 수는 없습니다. 또는 어떤 경우에는, 문제가되기에 충분히 길다면, 이것들은 정말로 거대한 파일이어야합니다 !!

어쨌든, 당신은 어떤 종류의 데이터 지속성이 필요합니다. Pickle, JSON, SQLite는 모두 옵션이지만,이 모든 경우에는 과도한 것처럼 보입니다. 나는 그것을 파일에 저장한다.

0

나는 간단한 방법을 사용합니다을

을 원하는 경우

당신은 컨텍스트 매니저 내부 데몬의 각 인스턴스를 포장 할 수있다. 현재 파일 위치와 생성 시간을 저장하십시오. 작성 시간이 늘어난 경우 새 파일입니다. 그렇지 않으면 저장된 위치에서 시작하십시오.

줄을 추가하거나 파일을 바꾼 것으로 가정합니다.

더 편집증적인 전략은 전체 파일을 저장된 오프셋까지 해시하여 변경 여부를 확인하는 것입니다.

+0

파일 생성 시간이 내가 처음 생각한 것이지만, 리눅스 파일 시스템 (이 경우에는 ext4)이 파일 생성 시간을 저장하지 않는다는 것을 이해하고 있습니까? – Jeremy

관련 문제