Как использовать меньше памяти при выполнении задачи в Symfony 1.4?

Я использую Symfony 1.4 и Доктрину.

До сих пор у меня не было проблемных выполняющихся задач с Symfony. Но теперь, когда я должен импортировать довольно большой объем данных и сохранить их в базе данных, я получаю печально известное

"Фатальная ошибка: Позволенная емкость памяти XXXX байтов исчерпывается"

Во время этого импорта я только создаю новые объекты, устанавливая несколько полей и сохраняя их.

Я вполне уверен, это имеет некоторое отношение к количеству объектов, которые я создаю при сохранении данных. Сбрасывание тех объектов ничего не делает все же.

Там какие-либо лучшие практики должны ограничить использование памяти в Symfony?

17
задан Guillaume Flandre 17 March 2010 в 15:05
поделиться

1 ответ

Я столкнулся с этим, и я обнаружил, что есть несколько приемов, которые действительно помогли с обширным использованием памяти Doctrine.

1: Где возможно, сведите результаты запроса Doctrine в массив. Вы можете сделать это, например, следующим образом:

$query = self::createQuery("q")->
  ...
  ->setHydrationMode(Doctrine::HYDRATE_ARRAY)
  ->execute();

Это заставляет Doctrine НЕ создавать большие объекты, а вместо этого сокращает их до массива. Очевидно, имейте в виду, что если вы сделаете это, вы потеряете возможность вызывать методы и т. Д., Так что это хорошо, только если вы используете его для чтения значений полей и т. Д.

2: Освободите ваши результаты после выполнения. Это задокументировано в крошечной части документации Doctrine, но это действительно помогло в задаче импорта, которую я использовал:

$query->free();

Вот и все. Вы также можете сделать это с объектами, которые вы создали, например $ myObj-> free (); , и это заставит Doctrine удалить все циклические ссылки, которые она создает. Обратите внимание, что циклические ссылки автоматически освобождаются, начиная с PHP 5.3 и далее, при удалении объекта через область действия PHP или unset () , но перед этим вам нужно будет сделать это самостоятельно.

Удаление переменных после того, как вы их использовали, также помогает, хотя делайте это в сочетании с методом free () , как упоминалось выше, поскольку unset () не очищает циркулярные ссылки в противном случае.

11
ответ дан 30 November 2019 в 13:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: