我有一個Lucene.net索引,包含10個字段,其中一些存儲了一些索引,其中有4.6億個文檔。該指數約爲250GB。我使用的是Lucene.net 3.0.3,每次我搜索時我都會輕易地在內存中佔用2GB以上的空間,這會導致我的32位應用程序出現內存異常。不幸的是,由於其他32位依賴關係,我無法將該應用程序作爲64位進程運行。Lucene.net內存耗盡大型索引
據我知道我下面Lucene的最佳做法:
一個開放式指數作家,在批次
共享閱讀器不會關閉寫入文件和跨重新本身搜索
索引搜索器的
termInfosIndexDivisor
設置爲4,這似乎沒有什麼區別。我甚至嘗試將它設置爲像1000這樣大的東西,但沒有注意到任何內存變化。不需要進行子庫搜索的字段不會被分析(即僅全字符串搜索),並且不需要從搜索中恢復的字段不會被存儲。
我使用默認
StandardAnalyzer
進行索引和搜索。如果我修剪數據並製作一個較小的索引,那麼事情就會奏效。當我有一個指數,它環繞50GB大小我只能與有關的RAM 600MB搜吧
不過,我確實有應用上的一個字段排序,但即使沒有排序的內存使用情況對於任何搜索都很重要。我並不特別關心文檔分數,更重要的是該文檔存在於我的索引中,但我不確定是否忽略分數計算將有助於內存使用。
我最近從Lucene.net 2.9.4升級到Lucene.net 3.0.3,認爲這可能有幫助,但內存使用情況在兩個版本之間看起來差不多。
坦率地說,我不確定這個索引對於一臺機器來說是否太大而無法搜索。我發現大多數的例子都是關於索引20-30GB或更小的索引,所以這可能是不可能的,但我至少想問。
如果任何人有任何建議,我可以做些什麼,這將是很好的可用。如果可能,我願意爲內存使用犧牲搜索速度。
這是一個不錯的主意,我可能必須這樣做。但我是否認爲在32位進程中運行這種索引是不可行的?我想確保我以後不會在單獨的應用程序中遇到同樣的問題,因爲我錯過了某種Lucene調優機會。 – devshorts
好,嚴重的是,即使它是可行的 - 你也不希望在RAM中緩存大部分索引。因爲任何IO到光盤都很慢。與可用內存相比,您的數據庫大小使得基於光盤的操作成爲可能。這總是很慢。你知道,來自數據庫的舊規則。 – TomTom