Ошибка вставки Laravel DB: разрешенный размер памяти исчерпан

У меня возникла проблема при попытке вставить ~ 20 000 записей в мою БД. Я замечаю, что, хотя я повторяю в своем цикле foreach, я ничего не вывожу в командной строке. Вместо этого я получаю сообщение об ошибке после вставки ~ 9440 записей, относящихся к...

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 91 bytes) in /Users/me/Sites/Laravel/database/connection.php on line 293

Вот мой код (пробовал использовать как Eloquent, так и Fluent):

<?php

class Process_Controller extends Base_Controller
{
    public function action_migrate()
    {
        $properties = DB::table('raw_properties')->get('id');
        $total = count($properties);

        foreach ($properties as $x => $p) {
            $r = RawProperty::find($p->id);
            $count = $x + 1;

            $prop_details = array(
                'column' => $r->field,
                // Total of 21 fields
            );

            DB::table('properties')->insert($prop_details);

            echo "Created #$count of $total\n";
        }
    }
}

person csm232s    schedule 15.09.2012    source источник


Ответы (2)


Эта ошибка означает, что ваш PHP-скрипт исчерпал лимит памяти из-за недостаточного объема памяти, выделенной для скрипта.

Вам необходимо увеличить memory_limit с помощью функции ini_set, например ini_set('memory_limit','128M');

person Rubin Porwal    schedule 16.09.2012
comment
Я только что столкнулся с этой проблемой, увеличение лимита памяти - это быстрое решение. Гораздо лучшим решением является отключение ведения журнала запросов, как рекомендовано @Erik ниже. - person th3hamburgler; 14.10.2013

Принятый ответ устраняет симптом, а не проблему. Проблема в том, что журнал запросов Laravel (в памяти) потребляет всю вашу оперативную память, когда вы выполняете такое большое количество запросов. См. ответ здесь: https://stackoverflow.com/a/18776710/221745

Или, вкратце, отключите ведение журнала запросов через:

DB::disableQueryLog()

Перед выполнением 20k запросов

person Erik    schedule 23.09.2013
comment
Я согласен. При вставке 1M строк в таблицу 2G было недостаточно, но DB::disableQueryLog() исправил это для меня. - person Antonio Carlos Ribeiro; 23.09.2013
comment
спасибо, я бы предпочел решить проблему, а не симптом - person malhal; 31.10.2014
comment
Нужно ли это снова включать, чтобы иметь Querylogging, или это для текущего скрипта? - person Ruben Arevalo; 29.12.2015
comment
В laravel 5 он по умолчанию отключен. Поэтому, если у вас есть проблемы с памятью, вы должны сделать обратное для проверки сгенерированных запросов: - person François Breton; 12.07.2016