2015-10-14 3 views
0

Я экономя много данных (Модель, в которой много моделей, вложенных в различные типы ассоциаций). Я получаю эти данные из внешнего веб-сервиса и после того, как Маршалл это я пытаюсь сохранить с транзакцией:CakePHP 3.x Transacction - не хватает ОЗУ

$this->connection()->transactional(function() use ($entities) { 
    foreach ($entities as $entity) { 
     $this->save($entity); 
    } 
}); 

probleam Сейчас я имею что мой процесс PHP запущен из памяти. Мой php.ini настроен на 128M.

Возможно ли уменьшить нагрузку на данные, сохраняющие объекты без использования транзакции?

спасибо.

+0

Вы пытаетесь очистить неизвестное количество записей за одну транзакцию - это не хорошо по многим причинам, из которых один из них заканчивается из ОЗУ. Более разумный подход - это промывка 10, 50 или 100 записей в рамках одной транзакции. В основном: разбить его на несколько транзакций и отправить партии по 10, 50, 100 (или поэкспериментировать с номером, чтобы попасть в sweetspot). – Mjh

+0

Привет @Mjh, как я могу подойти к представлению CakePHP 3.x? Не могли бы вы привести пример или ссылку на документ, который мог бы объяснить мне, как его разделить? Я попробую сохранить без транзакционного материала слишком просто в обычном режиме. – Tzaoh

+0

Ваши '$ entity' - это массив данных. Пройдите через него, разделите его на массив из 50 записей и используйте код, который вы разместили в вопросе. – Mjh

ответ

0

даже если вы петельные:

foreach ($entities as $entity) { 
     $this->save($entity); 
} 

$ объект, вероятно, все еще содержит много информации, поэтому заполнение проблемы памяти. Возможно, вы можете повторить или использовать var_dump и посмотреть, можете ли вы иметь $ entity, чтобы разбить его на части и иметь вложенный цикл внутри текущего foreach.

Смежные вопросы