データベースデータをディスクにインデックスするプログラムを作成しましたが、索引付けの速度が適切かどうか、つまり非常に遅いかどうか、速度をさらに向上できるかどうかはわかりません。Lucene Indexingパフォーマンス
私が得るスピードは、1時間あたり約15000ドキュメントで、新しいインデックスの作成には約2600KBのインデックスディレクトリサイズになります。
私は、Lucene 6.0.0とWindows 8.1 64ビットOS、16GB RAM、Intel Core i7 8 Coreマシンを使用しています。私はローカルマシン上でインデックスを作成していますが、どのような種類のディスクを持っているのかわかりません。通常はWindows PCに付属しています。
私はスプリングバッチをINNER JOIN
に2つのデータベーステーブルを使用して、ItemReader
から行マッピングオブジェクトを取得しています。このオブジェクトからDocument
を準備します。
Lucene 6.0.0では、既存のドキュメントを更新するだけでなく、ドキュメントがまだ存在しない場合は、ドキュメントをインデックスに追加するため、常にメソッドwriter.updateDocument(contentDuplicateKeyTerm, doc);
ではなくaddDocument(doc)
を使用しています。
私のプログラムを比較するベンチマークは認識していません。
お勧めします。
編集:これで、1時間に約1,800,000のドキュメントのパフォーマンスを達成することができました。各Document
を更新した後、問題はIndexWriter.commit()
となっていましたが、今は定期的にコミットしており、パフォーマンスが大幅に向上しています。
あなたは、人々があなたのパフォーマンスの問題を遠隔的に診断することは期待できません。クエリー、Lucene、およびディスク出力にパフォーマンスを分析し、ボトルネックを特定します。また、まだお持ちでない場合は、 'addDocument'と' updateDocument'の間の予想されるパフォーマンスの違いを知ることができます。重複を挿入していないことが分かっているなら、 'addDocument'を使いたいかもしれません。 –
はい、あなたは正しいです。私はパフォーマンスの問題があると言っているわけではありません、私はちょうど**通常の速度**と考えられているものとして知りたいです。私は私の質問を編集しました。私のコードで見つかった欠陥の1つは、各ドキュメントのコミットでした。私は 'updateDocument'を使用しています。なぜなら、重複が入り込む可能性があるからです(今のところ、あらかじめフィルタを外す方法はありません)。インデックスに重複を必要としません。 –
コミットは_huge_の違いを作ります。予想されるスピードは「非常に高い」です。それ自体で回転ディスクのスループットを最大限に引き上げる必要があります(これが「普通のもの」と考える場合)。 –