Java 用于大行计数的SOLR Out-of-memor查询

Java 用于大行计数的SOLR Out-of-memor查询,java,solr,out-of-memory,Java,Solr,Out Of Memory,如果我指定num rows=Integer.MAX\u值,SOLR似乎抛出内存不足错误 这对于大型数据集是有意义的,但在我的例子中,我正在运行的查询只有一个结果。然后我假设,无论我发送的“num rows”参数有多大,服务器都应该能够处理请求(因为返回数据集中只有一个结果) SOLR如何使用“行数”参数作为输入?SOLR在运行查询之前是否尝试预先分配内存 在Solr 3.5中,在溢出的情况下替换maxDoc()请求的文档数,因此不应该发生这种情况 如果Solr实际尝试分配Integer.MAX_

如果我指定num rows=Integer.MAX\u值,SOLR似乎抛出内存不足错误

这对于大型数据集是有意义的,但在我的例子中,我正在运行的查询只有一个结果。然后我假设,无论我发送的“num rows”参数有多大,服务器都应该能够处理请求(因为返回数据集中只有一个结果)

SOLR如何使用“行数”参数作为输入?SOLR在运行查询之前是否尝试预先分配内存

在Solr 3.5中,在溢出的情况下替换maxDoc()请求的文档数,因此不应该发生这种情况

如果Solr实际尝试分配Integer.MAX_值项,则此分配可能位于OOM的堆栈跟踪中。您应该检查:

  • 使用什么样的Solrindexearcher方法
  • Solr版本的SolrIndexSearcher源代码是否以与Solr 3.5相同的方式测试请求的文档数

永远不要指定rows=Integer.MAX\u值。检索页面中的数据,并为行设置合理的大小

如果Solr真的返回了数百万行,那么可能会发生各种不好的事情,客户端内存不足,在计算时读取超时,然后重试,等等


您可能希望为此提交一个bug,但这本质上是一个错误输入的错误行为

您的回答似乎暗示这确实是SOLR中的一个bug。谢谢你的反馈。我希望它要么拒绝这个错误的输入值,也许是400 HTTP响应,要么忽略它并修复它。看来Solr3.5实现了后者。抛出OfMemory不是对错误输入的正确响应。尽管如此,在你的代码中这样做是一个定时炸弹,即使Solr接受它。我必须经常进行Solr转储,并且我将行数设置为10M或更高。如果客户机内存不足,这是客户机的错误,与SOLR无关。同样,这是一个坏主意。获取页面中的结果。此外,出于这个和其他原因,使用Solr作为存储库不是一个好主意。您永远不必转储Solr的内容,它应该在一个单独的存储库中。这个问题更像是关于Solr的一般性问题,而不是一个特定的问题。这个问题的解决方案是显而易见的——但我更感兴趣/惊讶的是,当结果集的元素数如此之少时,SOLR可能会通过一个异常。如果您执行完全相同的查询,但行数为1,它可以正常工作吗?SOLR是抛出outofmemory异常还是抛出它的客户机异常(比如说SOLRj)?您的SOLR版本和堆栈跟踪也会有所帮助,谢谢您的反馈。。。我会调查的。您是否建议SOLR预先分配结果集的大小?这似乎有些奇怪,但在结果规模较小的“正常”场景中,这样做可能有一定的价值。顺便说一句,我使用的是Java序列化SOLRDocument查询API,而不是JSON API,以防对这种情况有所了解。我建议这不应该发生,但因为这是您的假设,所以您应该检查您的Solr版本是否存在此缺陷。如果存在这个bug,您应该升级Solr3.5中修复的bug,或者向Solr开发人员报告它。如果您向我们提供您的Solr版本和OOM的堆栈跟踪,我们可以帮助您cehck。