2016-10-06 14 views
0

データベースデータをディスクにインデックスするプログラムを作成しましたが、索引付けの速度が適切かどうか、つまり非常に遅いかどうか、速度をさらに向上できるかどうかはわかりません。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()となっていましたが、今は定期的にコミットしており、パフォーマンスが大幅に向上しています。

+0

あなたは、人々があなたのパフォーマンスの問題を遠隔的に診断することは期待できません。クエリー、Lucene、およびディスク出力にパフォーマンスを分析し、ボトルネックを特定します。また、まだお持ちでない場合は、 'addDocument'と' updateDocument'の間の予想されるパフォーマンスの違いを知ることができます。重複を挿入していないことが分かっているなら、 'addDocument'を使いたいかもしれません。 –

+0

はい、あなたは正しいです。私はパフォーマンスの問題があると言っているわけではありません、私はちょうど**通常の速度**と考えられているものとして知りたいです。私は私の質問を編集しました。私のコードで見つかった欠陥の1つは、各ドキュメントのコミットでした。私は 'updateDocument'を使用しています。なぜなら、重複が入り込む可能性があるからです(今のところ、あらかじめフィルタを外す方法はありません)。インデックスに重複を必要としません。 –

+0

コミットは_huge_の違いを作ります。予想されるスピードは「非常に高い」です。それ自体で回転ディスクのスループットを最大限に引き上げる必要があります(これが「普通のもの」と考える場合)。 –

答えて

0

私は複数の間違いを犯していました。そのため、書き込みパフォーマンスが遅かったのです。いくつかの間違いや是正が下に列挙されています。

1.私は各文書の後にコミットしていましたが、Springバッチを使用しているので、各チャンクの後にコミットするようプログラムを変更しました。コミット間隔を増やすとパフォーマンスが大幅に向上しました。

2.私は不必要にライターインスタンスを閉じて再オープンしていました(最初のロジックはそう設計されていました)。私はプログラムのロジックを変更して、アプリケーションスコープ内で単一のライターインスタンスを維持し、必要な場所であればそれを再利用し続けました。

3.ソース・データはDB2データベースであり、読み取りはテーブルから遅かった。私はインデックスを追加して読み込みパフォーマンスを向上させました。

4.ルーセンライターはスレッドセーフなので、私はシングルスレッドの代わりにマルチスレッド化して書き始めました。

ルーネンライターのコミット間隔を長くしても、索引作成に時間がかかりません。大量の文書を保持し、文書の読み込みと準備に時間がかかりません。 Luceneは、残りの処理が高速であれば数分で数百万の文書を索引付けできます。