3

私の基本的な質問は、同じインデックスでクエリ (読み取り) を行う必要がある複数のスレッドがある場合に、NIOFSDirectory と SimpleFSDirectory のインスタンスを作成/使用する適切な方法は何ですか。さらに要点:クエリを実行して結果を取得する必要があるスレッドごとに XXXFSDirectory のインスタンスを作成する必要があります(その後、同じスレッドですぐに閉じます)、または「グローバル」(シングルトン)を作成する必要があります?) すべてのスレッドに渡され、すべてのスレッドが同時にそれを使用するインスタンス (そして、クエリが完了したときにそれを閉じるのは各スレッド次第ではありません)?

詳細は次のとおりです。

NIOFSDirectory と SimpleFSDirectory の両方のドキュメントを読みましたが、得たものは次のとおりです。

  • どちらもマルチスレッドをサポートしています。

NIOFSDirectory : " java.nio の FileChannel の位置読み取りを使用する FSDirectory 実装。これにより、複数のスレッドが同期せずに同じファイルから読み取ることができます。 "

SimpleFSDirectory : " java.io.RandomAccessFile を使用した FSDirectory の単純な実装。ただし、このクラスは、複数のスレッドが同じファイルから読み取るときに同期するため、同時実行パフォーマンスが低下します (複数のスレッドがボトルネックになります)。通常は、代わりに NIOFSDirectory または MMapDirectory を使用することをお勧めします。 . "

  • NIOFSDirectory は、マルチスレッドのコンテキストで SimpleFSDirectory よりも適しています (基本的には高速です) (上記を参照)。

  • NIOFSDIrectory は、Windows ではうまく機能しません。Windows では、SimpleFSDirectory が推奨されます。ただし、*nix OS では NIOFSDIrectory が正常に動作し、マルチスレッド時のパフォーマンスが向上するため、SimpleFSDirectory よりも推奨されます。

"注: Sun の JRE での FileChannel.read の実装方法にバグがあるため、NIOFSDirectory は Windows では推奨されません。実装の内部では、明らかに位置が同期されています。 "

私がこれを尋ねている理由は、ターゲット OS が Linux であり、NIOFSDirectory を使用してインデックスから読み取るが、そのインスタンスが (各スレッドからの) 要求ごとに作成される実際のプロジェクトを見てきたことです。クエリが完了して結果が返されると、スレッドはそのインスタンスを閉じます (次のリクエストなどで新しいインスタンスを作成するためだけに)。したがって、これが本当に単一の NIOFSDirectory インスタンスをすべてのスレッドで共有し、アプリケーションの起動時にそれを開いて、特定の (マルチスレッド) ジョブが終了したときに閉じるよりも、本当に優れたアプローチであるかどうか疑問に思っていました。 ..

さらに言えば、Webアプリケーションの場合、 NIOFSDirectory のインスタンスを作成し、それをアプリケーションコンテキストに配置し、すべてのサーブレットがそれを共有して使用し、同じコンテキストリスナーを使用するコンテキストリスナーのようなものを用意する方が良いのではないでしょうか?アプリがシャットダウンすると閉じますか?

4

1 に答える 1

2

Lucene の公式 FAQでは、次のように提案されています。

アプリケーション内のクエリ間およびスレッド間で単一の IndexSearcher を共有します。

IndexSearcherは singleを必要IndexReaderとし、後者はDirectoryReader.open(Directory)の 1 つのインスタンスのみを必要とする で生成できますDirectory

于 2013-02-18T15:28:10.200 に答える