2017-11-30 5 views
0

私は、テキストファイルの名前が定義されていないディレクトリがあるとします。だから私は、それぞれの中にあるセットのどれくらいの単語があるかをチェックしたい。これらのファイルは巨大なサイズを持つことができるので、私はこれをPythonで最も効率的に使う方法を考えていました。この古典的なアプローチは理想的なものとして見ていない:メモリ内のファイルを扱う最良の方法Python

for file in files: 
    with open(file) as f: 
     content = f.readlines() 
     for word in words: 
      if word in content: 
       count+=1 

私の質問は以下のとおりです。私はメモリに大容量のファイルを処理する必要がありますどのように

  1. この複雑さはO(n * m)です(n =ファイル数、m =#単語数)。これを減らすことは可能ですか?それとも、私を助けるデータ構造がありますか?

答えて

3

最初のステップはreadlines()を使用しないことであろう - それを一度、メモリにファイル全体の内容をダンプするので、時間計算量はさておきメモリ複雑度は、(N×m個)の直Oまでです。 readline()を代わりに使用して、EOFまで1行ずつ読むことで、それを減らすことができます。

時間的には、おそらくコレクションの一部を探しています。すでに遭遇した単語をO(1)ルックアップすることができます。

+0

はい、メモリの複雑さに関しては正しいですが、readlineを使用すると多くの読み込みが作成されます。それ以上の行を格納できるバッファを使用する方が良いでしょう。 しかし、私は時間に関して言おうとしていることに従っていません。 – m33n

+1

Readlines()はreadline()を繰り返し呼び出すので、同等です。リストの理解とジェネレータの表現の違いに似ていますが、最終的な結果は同じですが、すべてを1つにまとめてやっています。時間ディクテーションを使用すると、すでにカウントされている単語のリストを反復処理しないで、増分との一致を見つけることができます。それはハッシュマップです。 – jkm

関連する問題