我正在尝试将几个 mongo 集合重新索引到 WebSolr 中。较小的集合可以很好地建立索引,但我无法让 Sunspot 重新索引较大的集合(约 150k 文档)而不会耗尽内存。我试过隔离模型并添加 10 和 5 批次,但没有运气。
我可以在本地机器上将这些索引到 solr 的本地实例中。
另外,有没有办法将本地 solr 索引迁移到 websolr?
在没有看到您的代码或对数据一无所知的情况下,我只能猜测问题所在,但听起来这可能是您在 Sunspot 中加载数据的方式的问题。
澄清一下,当您执行重新索引操作时,Sunspot 正在从您的主数据存储(在本例中为 MongoDB)读取数据,然后将该数据发送到 websolr。如果您使用类似的东西,那么 Sunspot 正在将该模型的所有Model.all
数据加载到内存中。如果您有很多记录,那么很容易导致 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
. 然后,您可以将本地 Sunspot 配置为指向该 URL 并运行rake sunspot:reindex
. 这应该将您的数据从本地环境迁移到您的 websolr 索引。
资料来源: