Рассмотрим этот код (завернутый внутри функции):
$manager = $this->manager; // local ref $q = $manager->createQuery('select c from VendorFeedBundle:Category c'); $iterableResult = $q->iterate(); $i = 0; $batchSize = 500; foreach($iterableResult as $row) { $category = $row[0]; $struct = explode(' ' . $this->separator . ' ', $category->getPath()); unset($struct[count($struct) - 1]); $path = implode(' ' . $this->separator . ' ', $struct); if (!$parent = $this->repo->findOneBy(['path' => $path])) { continue; } $category->setParent($parent); // flush every x entities if (($i % $batchSize) == 0) { echo 'Flushing batch...' . "\n"; echo 'Memory: ' . $this->getReadableSize(memory_get_usage()) . "\n"; $manager->flush(); $manager->clear(); echo 'After batch...' . "\n"; echo 'Memory: ' . $this->getReadableSize(memory_get_usage()) . "\n"; } ++$i; } // flush the remaining $manager->flush(); $manager->clear();
Он регистрирует в моем терминале следующее:
Creating tree... Memory: 14.91 MB Flushing batch... Memory: 18.46 MB After batch... Memory: 18.79 MB Flushing batch... Memory: 21.01 MB After batch... Memory: 23.29 MB Flushing batch... Memory: 25.36 MB After batch... Memory: 27.87 MB Flushing batch... Memory: 29.88 MB .... etc
Метод getReadAbleSize не пропускает какие-либо переменные в глобальную область или что-либо еще. Я читал и следил за советом о вложениях / обновлениях doctrine2 bulk (пакетная обработка): http://docs.doctrine-project.org/en/latest/reference/batch-processing.html
Что я делаю не так? Увеличение памяти 3 ~ 4 МБ на 500 единиц кажется мне (небольшой) утечкой.
Sidenote: Мне нужно обновить элементы таким образом, потому что моя система разделена на два процесса; сначала я вставляю категории, а во-вторых, я обновляю родительское отношение.
Мой класс категории является базовым объектом Doctrin2 с добавлением нескольких добавлений Gedmo (дерево, переводное, временное). См. Http://pastie.org/private/oiiyf54zjuouhiqjsjislg
Мой полный скрипт (который выполняет итерацию и обновление категорий): http://pastie.org/private/k5x240vr4taepczhqa4tva