Доктрина 2.1: использование памяти увеличилось после сброса - PullRequest
2 голосов
/ 17 марта 2012

мне действительно не понятно, почему после flush () память увеличивается, а не уменьшается? Я не могу найти ничего полезного в документации. Я сбрасываю каждые 50 итераций цикла, и после каждого сброса использование памяти увеличивается на 1 МБ. 100 промывок использует 100 МБ! Что мне здесь не хватает? Я видел на сайте доктрины пример с clear (), но если я его использую, я получил исключение, что один из моих объектов не имеет установленного каскадного сохранения. Может ли кто-нибудь объяснить мне, что делается за кулисами и что я должен делать, чтобы правильно сбросить все объекты доктрины?

Ответы [ 3 ]

5 голосов
/ 14 декабря 2012

Также читайте здесь: http://docs.doctrine -project.org / ru / 2.0.x / reference / batch-processing.html

Предлагает использовать $ em-> clear() после каждой основной операции.(что должно дать тот же эффект, что и предложенный Бесник).

Из ранее упомянутой ссылки:

Массовые вставки в Doctrine лучше всего выполнять в пакетах, используя преимущества транзакции записиза поведением EntityManager.В следующем коде показан пример вставки 10000 объектов с размером пакета 20. Возможно, вам придется поэкспериментировать с размером пакета, чтобы найти наиболее подходящий для вас размер.Большие размеры партии означают более подготовленное повторное использование оператора внутри, но также означают больше работы во время очистки.

4 голосов
/ 08 июля 2012

Проблема в том, что менеджер сущностей обрабатывает все объекты. Вы должны сбросить его, если вам не нужны объекты в оперативной памяти после каждой итерации X. Попробуйте это:

// get the entity manager and save objects and flush
$em = $this->get('doctrine')->getEntityManager();
...
$em->flush();

// then reset the entity manager
$this->get('doctrine')->resetEntityManager();
0 голосов
/ 26 марта 2014

У меня была похожая ситуация с массовой вставкой записей (более 100К).Я следовал советам Рауни и Бесника и руководству Doctrine по пакетированию, но память все еще росла даже после $ em-> clear () и resetEntityManager ().Через несколько дней я возглавил информационное уведомление о документации Doctrine:

Инструмент ORM не подходит в первую очередь для массовых вставок, обновлений или удалений.Каждая СУБД имеет свой собственный, наиболее эффективный способ работы с такими операциями, и если описанных ниже вариантов недостаточно для ваших целей, мы рекомендуем использовать инструменты для конкретной СУБД для этих массовых операций.и использовал сырой SQL (MySQL) и пакетные вставки.Использование памяти увеличилось с 200 МБ в Doctrine до 30 МБ в режиме необработанного SQL.И я мог видеть уменьшение использования памяти, когда я вытолкнул элементы, которые будут вставлены из исходного массива.Также намного быстрее, от 220 до 20 секунд.

...