Мне нужно обработать большой набор данных с помощью Doctrine, но я столкнулся с утечками памяти в Doctrine2, и я не могу понять, что еще я могу сделать, чтобы избежать этого.
Я максимально упростил код, но даже этот простой код вызывает утечку памяти (обратите внимание, я не делаю никаких вставок, обновлений, сбросов и т. Д. Только выбираю данные)
gc_enable();
$conn = $em->getConnection();
$conn->getConfiguration()->setSQLLogger(null); // disabling Logger
$batchSize = 10000;
for ($i=0; $i<$batchSize*10; $i+=$batchSize) {
echo "#".$i." - ";
$query = $em->createQuery('
SELECT
p
FROM
Application\Entity\Product p
WHERE
p.id > :id
ORDER BY
p.id ASC
')
->setParameter('id', $i)
->setMaxResults($batchSize);
$query->useQueryCache(false);
$query->useResultCache(false);
$products = $query->getResult();
// trying to clear all that is possible
$query = null;
$products = null;
$em->clear();
$em->close();
gc_collect_cycles();
$mu = memory_get_usage(true);
echo "Memory: ".number_format($mu/1000000, 2)." Mb\n";
}
Вот вывод:
#0 - Memory: 87.29 Mb
#10000 - Memory: 94.37 Mb
#20000 - Memory: 100.66 Mb
#30000 - Memory: 110.36 Mb
#40000 - Memory: 119.01 Mb
#50000 - Memory: 123.99 Mb
#60000 - Memory: 131.07 Mb
#70000 - PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 40 bytes) in ...\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php on line 2615
Что еще я могу попытаться выполнить, чтобы избавиться от этой утечки?
Учение ОРМ 2.4.6
Доктрина DBAL 2.4.2
Задача ещё не решена.
Других решений пока нет …