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