Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
填充FosElasticaBundle耗尽php内存,可能内存泄漏?_Php_Symfony_Memory Leaks_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Foselasticabundle - Fatal编程技术网 elasticsearch,foselasticabundle,Php,Symfony,Memory Leaks,elasticsearch,Foselasticabundle" /> elasticsearch,foselasticabundle,Php,Symfony,Memory Leaks,elasticsearch,Foselasticabundle" />

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

填充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

我已经安装了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/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