填充FosElasticaBundle耗尽php内存,可能内存泄漏?
我已经安装了FOSElasticaBundle,并让它处理我的数据的横截面 我的问题在于我需要使用大约1400万行来构建索引。我运行了populate命令,昨天大约6小时后,它出现了10.8%的内存错误:填充FosElasticaBundle耗尽php内存,可能内存泄漏?,php,symfony,memory-leaks,
elasticsearch,foselasticabundle,Php,Symfony,Memory Leaks,
elasticsearch,Foselasticabundle,我已经安装了FOSElasticaBundle,并让它处理我的数据的横截面 我的问题在于我需要使用大约1400万行来构建索引。我运行了populate命令,昨天大约6小时后,它出现了10.8%的内存错误: PHP Fatal error: Allowed memory size of 2147483648 bytes exhausted (tried to allocate 52277 bytes) in /var/www/html/vendor/monolog/monolog/src/Mon
PHP Fatal error: Allowed memory size of 2147483648 bytes exhausted (tried to allocate 52277 bytes) in /var/www/html/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php on line 111
如您所见,我已经将php内存限制设置为2G,这应该是非常过度的
错误前的最后一行看起来像
Populating index/entity, 10.8% (1315300/12186320), 36 objects/s (RAM : current=2045Mo peak=2047Mo)
每一条线路的电流和峰值都在上升,大约从30mb开始
我的假设是有某种内存泄漏?当然php的内存不应该被这个过程耗尽。我还尝试了带有一些额外参数的命令
app/console fos:elastica:populate --no-debug --no-reset --env=prod
但当我看着它运行时,当前的内存仍在滴答作响
关于这里可能发生的事情以及我可以做些什么来调试它,有什么想法吗?我发现这个讨论听起来像是我的问题,但并不是一个好的解决方案:。我使用的是条令和默认提供者
谢谢-我无法完全解决内存泄漏问题,但可以通过运行命令来解决
app/console fos:elastica:populate --no-debug --no-reset --env=prod --offset=n
我已经能够批量填充。我使用本页上的解决方案,通过关闭记录器,大幅减少了内存泄漏量
将我的php内存限制设置为4G(!),我可以获得超过500万条记录,并且不会出错,因此在几批之后,我应该完成这个过程
大多数解决方案似乎都涉及编写自定义提供程序(请参阅),但通过荒谬的内存限制和尽可能多地限制内存泄漏,我并不需要这样做。这里的主要问题是所有操作都在一个进程中完成,所有实体都必须加载到内存中。它是由块完成的,但仍然加载所有数据。你可以用它做很多事情,因为设计中存在问题 解决方案:可以将数据分割成块,并在单独的进程中并行处理。工作进程可能会不时退出(必须通过Supervisord或类似工具重新启动),以释放内存和资源。因此,您将获得更好的性能、更好的容错性和更少的内存占用 有很多方法可以实现这一点(使用fork、pthread或消息队列),但我个人建议看一下。它通过拆分作业和发送消息来改进populate命令 如果
--no debug
选项不够,您可能需要检查是否有任何叉指处理程序,并设置缓冲区大小:
monolog:
handlers:
main:
type: fingers_crossed
action_level: critical
handler: grouped
excluded_404s:
- ^
buffer_size: 30
您可能需要重置并再次开始索引,以重置:php应用程序/控制台fos:elastica:reset