2012-12-26 115 views
2

我有一個應用程序創建一個相當大的Solr 3.6索引,約。 300GB的1B文件,每天分成10個核心。索引編制效果很好,我使用循環算法在覈心之間均勻分配文檔。搜索對我來說也很好,直到返回結果集大於100K +文檔。Solr - Java內存不足

在這一點上,我得到一個Java錯誤返回:要麼OutOfMemoryError異常或SolrException:解析錯誤

我的搜索是簡單的,不使用通配符或排序或分面搜索,但似乎緩衝整個結果之前設置返回它。我的服務器上的物理內存是256G,我正在運行Solaris 10.我使用默認的32位Java,但也嘗試過32位和64位的Java 7。

當我使用64位Java時,我能夠增加最大內存以使用-Xmx選項返回1M +文檔,但它實際上只需要一個Solr進程的所有內存。

除了用數百個微小的索引重新設計我的應用程序,沒有人有任何建議如何從沒有大量內存的Solr獲得大型搜索結果集?

+0

你的文件有多大?你在索引什麼,你在儲存什麼? 「分爲10個核心」是什麼意思? –

+0

隨着32位jvm,你將被限制在大約3g的堆,所以如果這確實需要更多的東西,你絕對會需要64位,但這似乎是不言而喻的基礎上,你的能力讓事情運行,儘管幾乎將你的整臺機器的RAM放棄了。看到這個問題的一些建議,如何挖掘做內存分配分析:http://stackoverflow.com/questions/1839599/analyze-gc-logs-for-sun-hotspots-jvm-6/1841109#1841109 – gview

+1

我認爲這對於32位JVM是2GB的限制:http://stackoverflow.com/questions/2457514/understanding-max-jvm-heap-size-32bit-vs-64bit – duffymo

回答

2

您可以嘗試禁用各種caches(例如filterCache,queryResultCachedocumentCache)。這可能會損害表現,但可能會給人一些喘息的空間。

如果您的Solr HTTP/XML響應很大,您可以考慮使用placing Solr under the same JVM,甚至使用原始Lucene節省XML開銷。

除此之外,恐怕你需要考慮分片。

+0

我會考慮調整或關閉這些緩存參數,並讓我們知道在我的情況下是否會提高內存利用率。謝謝。 – scottw

+0

我已經測試過關閉了您建議的每個緩存參數,包括來自SolrCaching wiki的一些額外參數,但不幸的是結果並不理想。沒有一個參數影響內存利用率,正如我使用prstat所觀察到的。就像你預測的那樣,一些參數對性能有負面影響。 即使在簡單搜索的情況下,您是否對Solr爲何在寫入輸出之前緩存整個結果有所瞭解? – scottw

+0

我更像是一個Lucene而不是Solr,所以我不會對Solr內部有太多瞭解。然而,在Lucene的世界裏,搜索結果只需要非常有限的內存:[一些相當便宜的對象](http://lucene.apache.org/core/4_0_0-BETA/core/org/apache/lucene/搜索/ TopDocs.html)。我猜想Solr可能遍歷所有結果集並加載每個文檔。相反,您可以逐個加載文檔,並讓GC完成其工作。您可以嘗試使用[Luke](http://code.google.com/p/luke/)運行索引:只需執行相同的搜索並查看使用了多少內存即可。 – mindas