gpt4 book ai didi

multithreading - 具有多线程的 Lucene NIOFSDirectory 和 SimpleFSDirectory

转载 作者:行者123 更新时间:2023-12-02 02:06:08 33 4
gpt4 key购买 nike

我的基本问题是:当有多个线程需要在同一索引上进行查询(读取)时,创建/使用 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 的方式存在错误,因此不建议在 Windows 上使用 NIOFSDirectory。在实现内部,位置显然是同步的。

我问这个的原因是我见过一些实际项目,其中目标操作系统是 Linux,NIOFSDirectory 用于从索引中读取,但是为每个请求创建它的一个实例(从每个线程),一旦查询完成并返回结果,线程将关闭该实例(仅在下一个请求时创建一个新实例,等等)。所以我想知道这是否真的比简单地让所有线程共享一个 NIOFSDirectory 实例更好的方法,并且只是在应用程序启动时打开它,并在某个(多线程)作业完成后关闭它。 ..

更重要的是,对于 web 应用程序,拥有类似上下文监听器的东西不是更好,它创建 NIOFSDirectory 的实例,将其放入应用程序上下文,所有 Servlet 共享和使用它,然后当应用程序关闭时,相同的上下文监听器会关闭它吗?

最佳答案

Official Lucene FAQ建议如下:

Share a single IndexSearcher across queries and across threads in your application.

IndexSearcher 需要单个 IndexReader,后者可以使用 DirectoryReader.open(Directory) 生成,它只需要一个实例目录

关于multithreading - 具有多线程的 Lucene NIOFSDirectory 和 SimpleFSDirectory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14939556/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com