gpt4 book ai didi

php - 内存使用随着 Doctrine 批量插入变得疯狂

转载 作者:可可西里 更新时间:2023-11-01 13:46:56 25 4
gpt4 key购买 nike

我正在尝试使用 Doctrine2 和 Symfony2 fixture bundle 在 MySQL 数据库中插入大量数据(30000 多行)。

我看了the right way to do it .我看到很多关于内存泄漏和 Doctrine 的问题,但没有让我满意的答案。它经常出现在 Doctrine clear() 函数中。

所以,我做了各种形状:

while (($data = getData()) {
$iteration++;

$obj = new EntityObject();
$obj->setName('henry');
// Fill object...

$manager->persist($obj);

if ($iteration % 500 == 0) {
$manager->flush();
$manager->clear();

// Also tried some sort of:
// $manager->clear($obj);
// $manager->detach($obj);
// gc_collect_cycles();
}
}

flush() 之后,PHP 内存仍然很乱(我敢肯定)。事实上,每次刷新实体时,内存都会根据批处理大小和实体增加一定量,直到达到致命的Allowed Memory size exhausted 错误。对于非常非常小的实体,它可以工作,但内存消耗增加太多:几 MB,而它应该是 KB。

clear()detach() 或调用 GC 似乎根本没有效果。它只会清除一些 KB。

我的方法有缺陷吗?我在某处错过了什么吗?是错误吗?

更多信息:

  • 没有 flush() 内存几乎没有移动;
  • 降低批处理不会改变结果;
  • 数据来自需要清理的 CSV;

编辑(部分解决方案):

@qooplmao 带来了一个显着减少内存消耗的解决方案,禁用 doctrine sql logger:$manager->getConnection()->getConfiguration()->setSQLLogger(null);

但是,它仍然异常高并且还在增加。

最佳答案

我使用 this resource 解决了我的问题,正如@Axalix 建议的那样。

这是我修改代码的方式:

// IMPORTANT - Disable the Doctrine SQL Logger
$manager->getConnection()->getConfiguration()->setSQLLogger(null);

// SUGGESION - make getData as a generator (using yield) to to save more memory.
while ($data = getData()) {
$iteration++;

$obj = new EntityObject();
$obj->setName('henry');
// Fill object...

$manager->persist($obj);

// IMPORTANT - Temporary store entities (of course, must be defined first outside of the loop)
$tempObjets[] = $obj;

if ($iteration % 500 == 0) {
$manager->flush();

// IMPORTANT - clean entities
foreach($tempObjets as $tempObject) {
$manager->detach($tempObject);
}

$tempObjets = null;
gc_enable();
gc_collect_cycles();
}
}

// Do not forget the last flush
$manager->flush();

最后但同样重要的是,当我将此脚本与 Symfony 数据装置一起使用时,在命令中添加 --no-debug 参数也非常重要。然后内存消耗稳定。

关于php - 内存使用随着 Doctrine 批量插入变得疯狂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33427109/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com