ネストされた python 辞書の形で完全な逆インデックスがあります。その構造は次のとおりです。
{word : { doc_name : [location_list] } }
たとえば、辞書の名前を index とすると、「 spam 」という単語のエントリは次のようになります。
{ spam : { doc1.txt : [102,300,399], doc5.txt : [200,587] } }
Python dict はかなり最適化されており、プログラミングが容易になるため、この構造を使用しました。
任意の単語「スパム」について、それを含むドキュメントは次のように指定できます。
index['spam'].keys()
ドキュメント doc1 の投稿リスト:
index['spam']['doc1']
現在、cPickle を使用してこの辞書を保存およびロードしています。しかし、ピクルス化されたファイルは約 380 MB で、読み込みに長い時間がかかります - 112 秒 (約time.time()を使用して時間を計測しました) で、メモリ使用量は 1.2 GB になります (Gnome システム モニター)。ロードしたら、問題ありません。私は4GBのRAMを持っています。
len(index.keys())
229758を与える
コード
import cPickle as pickle
f = open('full_index','rb')
print 'Loading index... please wait...'
index = pickle.load(f) # This takes ages
print 'Index loaded. You may now proceed to search'
読み込みを速くする方法を教えてください。アプリケーションの起動時に一度だけロードする必要があります。あとは、クエリに応答するためのアクセス時間が重要です。
SQLite のようなデータベースに切り替えて、そのキーにインデックスを作成する必要がありますか? はいの場合、同等のスキーマを持つように値を保存する方法を教えてください。これにより、取得が容易になります。他に調べるべきことはありますか?
補遺
ティムの答えを使用pickle.dump(index, file, -1)
すると、ピクルス化されたファイルはかなり小さくなります-約237 MB(ダンプに300秒かかりました)...そしてロードに半分の時間がかかります(61秒...以前の112秒とは対照的に.... time.time () )
しかし、スケーラビリティのためにデータベースに移行する必要がありますか?
今のところ、Tim の回答を承認済みとしてマークしています。
PS :Lucene や Xapian は使いたくない... この質問は、逆インデックスの保存に関するものです。以前の質問を削除できなかったので、新しい質問をしなければなりませんでした。