【发布时间】:2012-12-12 09:23:09
【问题描述】:
我有一个应用程序可以创建一个相当大的 Solr 3.6 索引,大约300GB 1B 文档,每天分为 10 个核心。索引效果很好,我使用循环算法在核心之间均匀分布文档。搜索对我来说也很有效,直到返回结果集大于 100K+ 文档。
此时,我返回了一个 java 错误:OutOfMemoryError 或 SolrException:解析错误
我的搜索很简单,不使用通配符或排序或分面搜索,但它似乎在返回之前缓冲了整个结果集。我服务器上的物理内存是 256G,我运行的是 Solaris 10。我使用的是 32 位的默认 java,但也尝试过 32 位和 64 位的 java 7。
当我使用 64 位 java 时,我可以使用 –Xmx 选项将最大内存增加到足以返回 1M+ 文档,但它实际上只需要一个 Solr 进程所需的所有内存。
除了用数百个小索引重新设计我的应用程序之外,是否有人对如何在没有大量 RAM 的情况下从 Solr 获取大型搜索结果集有任何建议?
【问题讨论】:
-
您的文件有多大?你在索引什么,你在存储什么? “分成10个核心”是什么意思?
-
使用 32 位 jvm,您将被限制在大约 3gig 的堆中,所以如果这确实需要更多,那么您绝对需要 64 位,但这似乎基于您的让事情运行的能力,尽管几乎放弃了整个机器的 RAM。有关如何深入进行内存分配分析的一些建议,请参阅此问题:stackoverflow.com/questions/1839599/…
-
我认为这是 32 位 JVM 的 2GB 限制:stackoverflow.com/questions/2457514/…
-
我正在索引发票类型的文档,这些文档通常每个不到 1k。当我说分裂时,我指的是多核。我为每个 Solr 进程配置了 10 个内核。每天有1个Solr进程,让我可以进一步划分搜索和索引的处理,也可以轻松老化索引。
-
为什么 Solr 需要在返回之前缓冲我的查询结果?我没有进行任何排序或分面搜索。我可以理解使用缓冲读取器从磁盘读取,但它不应该要求它缓冲整个结果集,不是吗?