太阳黑子:reindex导致在Heroku中R14内存超出错误

时间:2014-04-17 18:06:58

标签: mongodb heroku solr sunspot websolr

我正在尝试将几个mongo集合重新索引到WebSolr中。较小的集合被编入索引就好了,但我不能让Sunspot重新索引较大的集合(约150k文档),而不会耗尽内存。我试过隔离模型并添加10和5批次但没有运气。

我可以将本地计算机上的这些索引编入solr的本地实例中。

另外,有没有办法将本地solr索引迁移到websolr?

1 个答案:

答案 0 :(得分:2)

如果没有看到您的代码或了解有关数据的任何信息,我只能猜测问题,但听起来这可能与您在太阳黑子中加载数据的方式有关。

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

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

看一下使用find_each方法,它将数据分批加载到内存中,而不是一次性加载到内存中。也就是说,将Model.all替换为Model.find_each(batch_size: <something>),其中<something>的批量大小足以避免R14错误。如果调整得当,您应该能够在不超过Heroku的内存配额的情况下快速重新编制索引。

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

来源: