我在 FSdirectory 中有一个索引文件,大小约为 2GB。我想将它加载到内存中以获得更好的搜索速度。我使用后面的代码:
Directory dic=new RAMDirectory(FSDirectory.open(new File("file path")), IOContext.DEFAULT);
但我不确定它是否有效。有谁知道它是否有效?还有比这更好的方法吗?
我会很高兴有任何建议。谢谢。
是的,您可以像这样构造 RAMDirectory,但强烈建议您不要这样做。RAMDirectory 不适用于大型数据集(超过 100MB)。这将是非常密集的 GC,构建和消耗宝贵的 JAVA Heap 空间的时间很长。
如果您有性能问题,请确保您遵循 此 lucene 常见问题解答中描述的所有指南
不要忘记,为了获得下降搜索速度,操作系统需要将索引的某些部分缓存到内存中。为此,您必须让一些免费的内存可供操作系统使用。如果你有 16Gb 的物理 RAM 和 8gb 的索引,你应该用 8g 配置 jvm Xmx。检查 mem 的一个不错的 linux 工具是 htop,它会将用于进程的 RAM 打印为绿色(您的堆空间),并将用作文件缓存的 RAM 打印为黄色(索引数据)。
一些开发人员在应用程序启动时执行预热查询,以防止第一个用户在 os 文件缓存加载索引时被卡住几秒钟。
然后,如果您仍然认为您可以获得更好的性能,您可以尝试使用 RAMfs 的一些技巧。但我怀疑你能否获得比使用 MMapDirectory 调优好的 os 和 jvm 更好的性能。