2012-02-07 30 views
1

私は、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

私は、単に行を格納する前にそれをハッシングすると思うとは思えません。とても簡単です。私はコンテキストマネージャーのアイデアについて興味がある。コンテクストマネージャは何をするために使われるのですか?私はまだそれらのうちの1つを実際に使用しています。 – Jeremy

+0

私はいくつかの例のコードを追加しましたが、特に私の解決策が好きではありません。うまくいけば、contextmanagerの例はすべて同じように面白いと思います。 –

0

ハッシュを保存する際に問題が発生する場合は、行全体を保存することもできます。それはそれほど長くはありません。または、いずれにせよ、それが問題になるのに十分な長さであれば、これらは本当に巨大なファイルでなければなりません!!

とにかく、何らかのデータの永続性が必要です。 Pickle、JSON、SQLiteはすべてのオプションですが、これらはすべてこの場合過剰なようです。私はファイルに保存するだけです。

0

から

をしたい場合、私は簡単な方法を使用しますコンテキストマネージャ内のデーモンの各インスタンスをラップすることができます。現在のファイルの位置と作成時刻を保存します。作成時間が増加した場合は、新しいファイルになります。それ以外の場合は、保存された位置から開始します。

これは、行だけが追加されたか、ファイルが置き換えられたことを前提としています。

もっとパノラマ的な戦略は、保存されたオフセットまでファイル全体をハッシュして、変更されているかどうかを確認することです。

+0

ファイル作成時間が私が考えた最初のものでしたが、Linuxファイルシステム(この場合はext4)はファイルの作成時間を節約しないと私は理解していますか? – Jeremy

関連する問題