Задать вопрос
kolyafat
@kolyafat

Laravel выгрузка 25 000 записей в бд, БД зависает???

Всем Здравствуйте, прошу помощи, опыта не ахти, а очень хочется, в общем ситуация такая: парсю из xml данные в несколько массивов, происходит все влет, потом forech пишет строки в БД (25 000) и она зависает, такие выгрузки нужны регулярно, как грамотно решается эта задача, в сторону очередей почитывать или ноу, из документации я понял что очереди тоже в БД пишет, смысл тогда какой?, словом, кому не лень поделитесь опытом, буду очень признателен. Спасибо за внимание.
  • Вопрос задан
  • 311 просмотров
Подписаться 1 Оценить 6 комментариев
Пригласить эксперта
Ответы на вопрос 3
erniesto77
@erniesto77
oop, rb, py, php, js
Желательно никогда в цикле не обращаться к БД. Попробуйте вставить записи одним запросом insertAll($items)
abstract class Model extends BaseModel
{
    /**
     * @return string
     */
    public static function table()
    {
        return with(new static)->table;
    }

    /**
     * Insert each item as a row. Does not generate events.
     *
     * @param  array  $items
     *
     * @return bool
     */
    public static function insertAll(array $items)
    {
        $now = \Carbon\Carbon::now();
        $items = collect($items)->map(function (array $data) use ($now) {
            return array_merge([
                'created_at' => $now,
                'updated_at' => $now,
            ], $data);
        })->all();

        return \DB::table(static::table())->insert($items);
    }
}
Ответ написан
Комментировать
@Silm
Очередь нужна, чтобы вы или могли более равномерно использовать ресурсы (ресурсоемкие задачи выполнять не одновременно, а последовательно), либо чтобы могли из веб интерфейса создать задачу и не дожидаясь ее завершения продолжить работу с сайтом.

Вам надо смотреть что у вас и почему не выдерживает. Скорее всего ресурсов просто маловато для такой операции. Может вы нерационально их используете. Посмотрите, вдруг у вас утечка памяти происходит в PHP.
Ответ написан
Комментировать
Надо обернуть все запросы в транзакцию, либо сформировать один большой запрос. Вместо 25 000 которые у вас сейчас проводят вставку.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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