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

Я столкнулся с проблемой при попытке вставить ~20K записей в мою БД. Я замечаю, что хотя я повторяю эхо внутри моего цикла 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";
        }
    }
}

3 ответа

Решение

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

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

Принятым ответом является устранение симптома, а не проблемы. Проблема в том, что журнал запросов Laravel (в памяти) поглощает всю вашу оперативную память, когда вы выполняете такое большое количество запросов. Смотрите ответ здесь: /questions/25763057/laravel-eloquent-utechka-pamyati-pri-povtornom-poluchenii-odnoj-i-toj-zhe-zapisi/25763061#25763061

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

DB::disableQueryLog()

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

Я сделал DB::disableQueryLog() и продолжал получать ошибку. Я закончил тем, что приостановил Telescope от записи запросов. Вы можете сделать это из веб-интерфейса телескопа > запросы > щелкните значок паузы.

Другие вопросы по тегам