2013-07-31 51 views
5

我有一個硬盤索引文件,大小約爲2GB的FS目錄。我想加載它在內存中有更好的搜索速度。我使用後面的代碼:如何將FS目錄索引文件作爲Lucene中的RAM目錄加載?

Directory dic=new RAMDirectory(FSDirectory.open(new File("file path")), IOContext.DEFAULT); 

但我不確定它是否工作。有誰知道它的工作與否?任何其他方式比這更好?

我會很高興的任何建議。謝謝。

+0

你會得到更好的perf直接加載它(不要使用RAMDir),os文件緩存會爲你加載索引到mem。不要忘記相應地設置jvm Xmx:讓一些空閒的mem進入os,至少在你的情況下爲2G。 (例如在4G系統上使用Xmx2G)。 – nomoa

+0

@nomoa我不明白你直接加載的意思。怎麼做?請注意,我想在由tomcat運行的Web應用程序中使用它。 – anony

+0

我的意思是你不會有更好的搜索速度與RAMDirectory,看看這個java文檔說:警告:這個類不打算與巨大的索引。你可以通過調整jvm params和os params(linux上的swappiness)來獲得更好的搜索速度。你應該看看一些lucene perf FAQ。 – nomoa

回答

2

是的,你可以像這樣構造RAMDirectory,但在你的情況下強烈建議不要這樣做。 RAMDirectory不適用於大數據集(大於100MB)。這將是非常密集的GC,需要很長的時間來構建和消耗寶貴的JAVA堆空間。

如果你有PERF的問題,請確保您按照this lucene FAQ

descibed不要忘記,得到下降搜索速度操作系統需要緩存索引到內存中的某一部分的所有規定。爲了做到這一點,你必須讓一些空閒的mem可用於操作系統。如果你有16Gb的物理內存和8GB索引,你應該配置8g的jvm Xmx。一個很好的檢查內存的linux工具是htop,它將打印用於進程的內存爲綠色(堆空間)的RAM和用作文件緩存的內存爲黃色(索引數據)。

某些開發人員在應用程序啓動時執行熱身查詢,以防止第一位用戶在os文件緩存加載索引時被卡住幾秒鐘。

然後,如果你仍然認爲你可以獲得更好的perf,你可以嘗試一些RAMfs的技巧。但我懷疑你可以獲得比MMapDirectory的調優os和jvm更好的性能。

相關問題