Как решить проблему с ошибкой PHP Fatal Error 'yii\base\ErrorException' with message 'Out of memory?
В YII запускаю через php yii ... скрипт, который должен выполняться минут 10, но через несколько минут выскакивает ошибка PHP Fatal Error 'yii\base\ErrorException' with message 'Out of memory (allocated 1552941056) (tried to allocate 67108864 bytes)'. Как с этим бороться? Или как лучше организовать работу парсера, чтобы не грузил так сервер? Спасибо.
Артём: Ваш вопрос немного изменился.
Теперь он звучит - "Я написал самый обычный скрипт, который кушает много памяти - как мне его улучшить"?
Как мы можем вам помочь, кроме гадания на кофейной гуще?
У вас уже выделено 1.5Гб и очередной операцией вы выделяете 67Мб.
Либо у вас большие данные и надо как-то оптимизировать алгоритм, либо вы где-то забываете обнулить переменную и "напихиваете" в нее все больше и больше данных и куда-то ее еще в цикле добавляете.
Алексей: давай, переменная наполняется, в конце концов в ней может быть 5 миллионов индексов, но и это не предел. Хватает только на 4 миллиона. Это все в массиве, а в конце делаю implode и заношу в базу данных.
Артём: Рано или поздно ваш подход приведет к переполнению любой памяти.
Если не имеете возможности тут подробно описать что вы храните и обрабатываете, то вряд ли получите внятный совет.
Вариантов может быть масса - может быть что-то можно оптимизировать в плане хранения в памяти (например строки с целыми запаковать в бинарные данные что сократит потребление памяти), или есть возможность разбить работу на блоки по 1000 записей, или что-то можно запаковать в gzip, или если на сервере очень много памяти - использовать /dev/shm/ как временный диск в памяти или еще какие-то есть варианты.
Смотря что у Вас делает парсер, все индивидуально (может быть плохо написан сам скрипт, может использовать AR c 10000 записями без iterator и т.д.), плюс может можно побить работу на этапы или еще... про сферического коня в вакууме тяжело говорить.