【发布时间】:2021-10-11 15:17:31
【问题描述】:
在教义中遍历对象图是否可以扩展?
考虑这个类似图形的实体(保证无环):
/**
* @ORM\Entity()
*/
class Node {
//...
/**
* @ORM\ManyToOne(targetEntity="Node")
*/
public $child1;
/**
* @ORM\ManyToOne(targetEntity="Node")
*/
public $child2;
// ...
}
我正在像这样以迭代方式遍历对象图
$root = $this->em->find(Node::class, '1');
$stack = new Ds\Stack();
$stack->push($root->getId());
while(!$stack->isEmpty()) {
$node = $em->find(Node::class, $stack->pop());
work_on($node);
if($node->child1) $stack->push($node->child1->getId());
if($node->child2) $stack->push($node->child2->getId());
$this->em->clear();
gc_collect_cycles();
}
实际上,我的堆栈大小高达 70.000,我正在遍历大小为 1.000.000 个节点的图。
这就是深度优先搜索。我希望内存消耗保持不变,但它会不断上升,我看到 8 GB 甚至更多。 我很确定不会保留对已处理节点的任何引用。
如果我离开 UoW 清除并在开始时执行预取 $em->getRepository(Node:class)->findAll(),我将获得 13 GB 内存,仅此而已。所以对我来说,清除似乎真的没有帮助,以某种方式释放已处理的对象确实失败了。
【问题讨论】:
标签: php memory doctrine-orm