5

私は情報検索のプロジェクトに取り組んでいます。Hadoop/Pythonを使用して完全転置インデックスを作成しました。Hadoopは、ファイルに書き込まれる(word、documentlist)ペアとしてインデックスを出力します。すばやくアクセスできるように、上記のファイルを使用して辞書(ハッシュテーブル)を作成しました。私の質問は、アクセス時間が短いディスクにこのようなインデックスを保存するにはどうすればよいかということです。現在、私はpython pickleモジュールを使用して辞書を保存し、そこからロードしていますが、インデックス全体を一度にメモリに取り込みます(またはそうしますか?)。インデックスを保存および検索する効率的な方法を提案してください。

私の辞書の構造は次のとおりです(ネストされた辞書を使用)

{単語:{doc1:[場所]、doc2:[場所]、..​​..}}

辞書[word].keys()...などで単語を含むドキュメントを取得できるようにします。

4

6 に答える 6

5

棚に置く

現在、私はpython pickleモジュールを使用して辞書を保存し、そこからロードしていますが、インデックス全体を一度にメモリに取り込みます(またはそうしますか?)。

はい、それはすべてをもたらします。

問題ありますか?それが実際の問題でない場合は、それに固執してください。

問題があるとすれば、どのような問題がありますか。遅すぎる?速過ぎる?カラフルすぎる?メモリの使用量が多すぎませんか? どのような問題がありますか?

于 2010-09-10T19:45:12.573 に答える
1

Luceneを使用します。なぜ車輪の再発明をするのですか?

于 2010-09-14T03:24:54.057 に答える
0

次のように文字列に格納するだけです。

<entry1>,<entry2>,<entry3>,...,<entryN>

「,」文字が含まれている場合<entry*>は、「\t」などの他の区切り文字を使用してください。これは同等のピクルス化されたストリングよりもサイズが小さいです。

ロードしたい場合は、次のようにします。

L = s.split(delimiter)
于 2010-09-10T21:01:47.767 に答える
0

読み込みに時間がかかったり、メモリを使いすぎたりする場合は、データベースが必要になることがあります。使用できるものはたくさんあります。私はおそらくSQLiteから始めます。次に、問題は「軽減」されます;-)データベースから必要なものを取得するために適切なクエリを作成するだけです。このようにして、必要なものだけをロードします。

于 2010-09-10T22:36:36.707 に答える
0

辞書の repr() を保存し、それを使用して再作成できます。

于 2010-09-10T21:40:56.880 に答える
0

そのためにanydmbを使用しています。Anydbm は、キーと値として文字列のみを許可することを除いて、同じ辞書のようなインターフェイスを提供します。ただし、cPickle のロード/ダンプを使用してより複雑な構造をインデックスに格納できるため、これは制約ではありません。

于 2011-03-17T15:36:00.373 に答える