1

私はこのような人間の辞書ファイルを持っています(そのリストには10 億eng.dic近くの単語があるイメージ)。また、さまざまな単語のクエリを頻繁に実行する必要があります。

apple
pear
foo
bar
foo bar
dictionary
sentence

「foo-bar」などの文字列があります。そのファイルを検索して存在するかどうかを確認するより良い(より効率的な方法)はありますか。存在する場合は存在し、存在しない場合は辞書ファイルを追加します

dic_file = open('en_dic', 'ra', 'utf8')
query = "foo-bar"
wordlist = list(dic_file.readlines().replace(" ","-"))
en_dic = map(str.strip, wordlist)

if query in en_dic:
    return 1
else:
    print>>dic_file, query

Pythonに組み込みの検索機能はありますか? または、オーバーヘッドをあまりかけずにそのような検索を実行するためにインポートできるライブラリはありますか?

4

3 に答える 3

2

すでに述べたように、ファイルのサイズが大きい場合にファイル全体を調べることはお勧めできません。代わりに、確立されたソリューションを使用する必要があります。

  1. ドキュメント内の単語にインデックスを付け、
  2. インデックス作成の結果を適切な形式で保存します(データベースをお勧めします)。
  3. 単語がファイルに存在するかどうかを確認します(データベースを確認します)。
  4. 存在しない場合は、ファイルとデータベースに追加します。

データベースにデータを保存することは、車輪の再発明を試みるよりもはるかに効率的です。SQLiteを使用する場合、データベースもファイルになるため、セットアップ手順は最小限です。

繰り返しになりますが、SQLiteデータベースに単語を保存し、単語がファイルに存在するかどうかを確認するときにクエリを実行し、追加する場合は更新することを提案しています。

ソリューションの詳細については、この質問への回答を参照してください。

ドキュメント内の単語にインデックスを付ける最も効率的な方法

于 2012-09-17T06:30:47.050 に答える
0

最も効率的な方法は、この辞書で実行する最も頻繁な操作によって異なります。

毎回ファイルを読み取る必要がある場合whileは、結果がファイルの最後に表示されるまで、ファイルを1行ずつループ読み取りすることができます。これは、同時にファイルを更新できる複数の並行ワーカーがある場合に必要です。

毎回ファイルを読み取る必要がない場合(たとえば、辞書で機能するプロセスが1つしかない場合)、より効率的な実装を確実に記述できます。1)すべての行をset(ではなく)に読み込みlist、2)「新しい」ごとに"wordは両方のアクションを実行します-操作で更新setadd、wordをファイルに書き込みます。

于 2012-09-17T06:07:50.757 に答える
0

「かなり大きな」ファイルの場合は、行に順番にアクセスし、ファイル全体をメモリに読み込まないでください。

with open('largeFile', 'r') as inF:
 for line in inF:
    if 'myString' in line:
        # do_something
于 2012-09-17T06:09:43.703 に答える