Mongodb 太阳黑子:重新索引导致heroku中R14内存超出错误

Mongodb 太阳黑子:重新索引导致heroku中R14内存超出错误,mongodb,heroku,solr,sunspot,websolr,Mongodb,Heroku,Solr,Sunspot,Websolr,我正在尝试将一些mongo收藏重新索引到WebSolr中。较小的集合可以很好地建立索引,但我无法让Sunspot在内存不足的情况下对较大的集合(约150k个文档)重新建立索引。我尝试过分离模型并添加10和5的批次,但没有成功 我可以在我的本地机器上将这些索引到solr的本地实例中 还有,有没有一种方法可以将本地solr索引迁移到websolr?而不必查看代码或了解任何数据,我只能猜测问题所在,但听起来这可能是您在Sunspot中加载数据的方式的问题 为了澄清一点,当您执行reindex操作时,S

我正在尝试将一些mongo收藏重新索引到WebSolr中。较小的集合可以很好地建立索引,但我无法让Sunspot在内存不足的情况下对较大的集合(约150k个文档)重新建立索引。我尝试过分离模型并添加10和5的批次,但没有成功

我可以在我的本地机器上将这些索引到solr的本地实例中


还有,有没有一种方法可以将本地solr索引迁移到websolr?

而不必查看代码或了解任何数据,我只能猜测问题所在,但听起来这可能是您在Sunspot中加载数据的方式的问题

为了澄清一点,当您执行reindex操作时,Sunspot正在从您的主数据存储(本例中为MongoDB)读取数据,然后将该数据发送到websolr。如果您使用的是类似于
Model.all
,那么太阳黑子会将该模型的所有数据加载到内存中。如果您有很多记录,那么很容易导致R14错误,Heroku会抱怨您超出了内存配额。此外,与Heroku上的内存相比,本地计算机上的可用内存量可能是本地没有此问题的原因

这也解释了为什么批处理没有帮助。在Sunspot中进行批处理意味着Sunspot将获取加载到内存中的数据,并将其分批发送给Solr;显然,如果该数据的内存占用已经超过了Heroku设置的配额,您仍然会得到R14。相反,您需要使用ActiveRecord执行批处理以降低内存使用率

看看如何使用
find_each
方法,它将数据批量加载到内存中,而不是一次全部加载。也就是说,将
Model.all
替换为类似
Model.find_each(batch_size:)
,其中
是一个足够小的批大小,可以避免R14错误。经过适当的调整,您应该能够快速地重新编制索引,而不会超过Heroku中的内存配额

至于您关于将本地索引加载到websolr的问题,您可以始终使用
heroku config
查找您的
websolr\u URL
。然后,您可以将本地太阳黑子配置为指向此URL并运行
rake Sunspot:reindex
。这将把数据从本地环境迁移到websolr索引

资料来源: