问题标签 [niofsdirectory]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1367 浏览

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

我的基本问题是:当有多个线程需要对同一索引进行查询(读取)时,创建/使用 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 上使用。

"注意:不建议在 Windows 上使用 NIOFSDirectory,因为在 Sun 的 JRE 中实现 FileChannel.read 的方式存在错误。在实现内部,位置显然是同步的。 "

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

更重要的是,对于 Web 应用程序,拥有一个上下文侦听器之类的东西不是更好吗当应用程序关闭时关闭它?

0 投票
0 回答
791 浏览

java - Java 7 zipfs:文件也是文件夹

我一直在使用 Java 7 的 ZipFS 支持。

https://gist.github.com/stain/5591420

显示行为,我觉得有点奇怪。基本上,您可以创建一个 ZIP 文件系统,创建一个具有给定名称的文件,然后还创建一个具有相同名称的文件夹。

这样做的原因似乎是在内部文件夹在其名称后面附加了“/” - 但是这个新名称没有返回,因此您最终会遇到一个奇怪的情况,即 Files.isDirectory() 在成功完成文件后立即返回 false。创建目录()。

因此,只要您有“/”作为后缀,您甚至可以同时使用两者,如果您对根目录进行目录列表,这就是它们的列出方式。

现在 ZIP 格式本身允许这样做,因为它只处理 ZIP 文件中的条目(甚至允许多个具有相同名称的条目),但是正常使用“文件系统”通常不允许多个具有相同名称的条目;当我尝试创建文件夹两次时可以看出。

生成的 ZIP 文件可以用 infozip、7Zip 和 Windows 8 正确浏览;但是尝试解压缩显然会失败,因为本机文件系统不支持这种二元性。

那么这是一个功能,错误还是介于两者之间的东西?