填充FosElasticaBundle耗尽php内存,可能是内存泄漏?

Pez*_*Pez 4 php memory-leaks symfony elasticsearch foselasticabundle

我已经安装了FOSElasticaBundle并让它处理我的数据的横截面.

我的问题出现了,我需要使用大约14m行来构建索引.我运行了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/Monolog/Formatter/LineFormatter.php on line 111
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我已经将我的php内存限制设置为2G,这应该是相当多的.

错误之前的最后一行看起来像

Populating index/entity, 10.8% (1315300/12186320), 36 objects/s (RAM : current=2045Mo peak=2047Mo)
Run Code Online (Sandbox Code Playgroud)

每条线路的电流和峰值都在上升,大约30mb.

我的假设是存在某种内存泄漏?当然,php的内存不应该被这个过程耗尽.我还尝试了一些额外的参数

app/console fos:elastica:populate --no-debug --no-reset --env=prod
Run Code Online (Sandbox Code Playgroud)

但是当我看着它正在运行时,当前的内存仍在不断增加.

关于这里可能发生什么以及我可以做些什么来调试它的想法?我发现这个讨论听起来像我的问题,但并没有真正提供一个好的解决方案:https://github.com/FriendsOfSymfony/FOSElasticaBundle/issues/82.我正在使用doctrine和默认提供程序.

谢谢-

Pez*_*Pez 6

我无法完全解决内存泄漏,而是通过运行命令

app/console fos:elastica:populate --no-debug --no-reset --env=prod --offset=n
Run Code Online (Sandbox Code Playgroud)

我已经能够分批填充.我使用此页面上的解决方案,通过关闭记录器来大幅减少内存泄漏量

https://github.com/FriendsOfSymfony/FOSElasticaBundle/issues/273

将我的php memory_limit设置为4G(!)我可以在没有错误的情况下获得超过500万条记录,因此在完成几个批次之后,我应该完成此过程.

大多数解决方案似乎都涉及编写自定义提供程序(请参阅https://github.com/FriendsOfSymfony/FOSElasticaBundle/issues/457),但通过一个荒谬的memory_limit并尽可能地限制内存泄漏,我不需要.