1

10 個のテキスト ファイルがあるディレクトリ内のいくつかのファイルを読み込もうとしています。時間が経つにつれて、ファイルの数が増え、現在の合計サイズは約 400MB になります。

ファイルの内容は次の形式です。

student_name:student_ID:date_of_join:anotherfield1:anotherfield2

一致した場合は、行全体を印刷する必要があります。これが私が試したことです。

findvalue = "student_id" #this is users input alphanumeric
directory = "./RecordFolder"
for filename in os.listdir(directory):
    with open(os.path.join(directory, filename)) as f:
        for line in f:
            if findvalue in line:
                print line

これは機能しますが、多くの時間がかかります。実行時間を短縮するにはどうすればよいですか?

4

2 に答える 2

4

テキストファイルが遅くなりすぎたら、データベースに目を向ける必要があります。データベースの主な目的の 1 つは、永続的なデータ ストレージからの IO をインテリジェントに処理することです。

アプリケーションのニーズによっては、SQLiteが適している場合があります。巨大なデータセットを持っていないように見えることを考えると、これがあなたが望んでいることだと思います。そこからは、データベース API 呼び出しを行い、SQLite がルックアップを処理できるようにするだけです。

(何らかの奇妙な理由で)本当にデータベースを使用したくない場合は、可能であれば、データをさらにツリーに分割することを検討してください。たとえば、生徒のデータを入れるアルファベットの各文字のファイルを持つことができます。これにより、ファイルごとの生徒数が減るため、ループ時間が短縮されます。これは簡単なハックですが、データベースを使えば抜け毛が減ると思います。

于 2012-08-04T19:49:47.723 に答える
1

IOは計算に比べて遅いことで有名であり、大きなファイルを処理していることを考えると、ファイルを1行ずつ処理するのがおそらく最善です。Pythonでこれを高速化する簡単な方法はわかりません。

「ヒット」(つまりfindvalue in line)の頻度に応じて、コンソール出力によって速度が低下しないようにファイルに書き込むことを決定できますが、見つかったアイテムが比較的少ない場合は、あまり重要ではありません。違い。

Pythonの場合、明確で主要なことは何もできないと思います。別のアプローチとして、他のツール(grepやデータベースなど)をいつでも調べることができます。

PS:else:pass..の必要はありません

于 2012-08-04T15:50:52.697 に答える