Laravel-excel: Допустимый объем памяти 134217728 байт исчерпан

Созданный на 19 июл. 2018  ·  22Комментарии  ·  Источник: Maatwebsite/Laravel-Excel

Предпосылки

  • [X] Возможность воспроизвести поведение за пределами вашего кода, проблема изолирована в Laravel Excel.
  • [X] Проверено, что ваша проблема еще не отправлена.
  • [X] Проверено, не был ли отправлен PR, который решает эту проблему.

Версии

  • Версия PHP: 7.1.13
  • Версия Laravel: 5.6
  • Версия пакета: ^ 3.0

Описание

Я получаю Allowed memory size of 134217728 bytes exhausted при попытке экспорта с опцией FromQuery

Действия по воспроизведению

Ожидаемое поведение:

Хочу исправить свою проблему :)

Фактическое поведение:

Дополнительная информация

namespace App\Exports;

use App\OldTransaction;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Http\Request;
use jDate;
use Maatwebsite\Excel\Concerns\Exportable;
use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithMapping;

class OldDepositExport implements FromQuery, ShouldQueue, WithMapping, WithHeadings, ShouldAutoSize
{
    use Exportable;

    /**
     * DepositExport constructor.
     * <strong i="27">@param</strong> Request $request
     */
    public function __construct(Request $request)
    {
    }

    public function headings(): array
    {
        return [
            'ID',
        ];
    }


    public function map($transaction): array
    {
        return [
            $transaction->id,
        ];
    }

    public function query()
    {
        return User::query()
            ->where('status', '=', 1)
            ->select(['id']);
    }
}

Смотрите это изображение https://i.imgur.com/yMgUqXP.jpg

Самый полезный комментарий

От кого вы ждете ответа?

Наше программное обеспечение является бесплатным и имеет открытый исходный код, а это означает, что использование нашего программного обеспечения не является обязательным. Мы не несем ответственности и не берем на себя никаких обязательств по поддержке. Мы будем оказывать поддержку в максимально возможной степени.

Если вы используете программное обеспечение в коммерческих целях и нуждаетесь в подробной поддержке или срочно нуждаетесь в ней, мы можем предложить это на коммерческой основе. Свяжитесь с [email protected] или по телефону +31 (0) 10744 9312.

Все 22 Комментарий

Может кто-нибудь мне помочь?

4 дня. нет ответа :-(

От кого вы ждете ответа?

Наше программное обеспечение является бесплатным и имеет открытый исходный код, а это означает, что использование нашего программного обеспечения не является обязательным. Мы не несем ответственности и не берем на себя никаких обязательств по поддержке. Мы будем оказывать поддержку в максимально возможной степени.

Если вы используете программное обеспечение в коммерческих целях и нуждаетесь в подробной поддержке или срочно нуждаетесь в ней, мы можем предложить это на коммерческой основе. Свяжитесь с [email protected] или по телефону +31 (0) 10744 9312.

Хорошо, пожалуйста, не закрывайте эту проблему. может кто это поправит.

Спасибо

Думаю, это проблема php-памяти, может, слишком много данных и переполнение памяти ... К библиотеке отношения не имеет.

@jlcarpioe У меня почти 200 тыс. строк. Проблема возникает при добавлении строк на лист

Вы пытались максимизировать memory_limit в php.ini?

@ bagana89 Это не

Я не могу воспроизвести вашу проблему. Я могу экспортировать таблицу пользователей из 300 тыс. Строк, используя предоставленный вами код. Обратите внимание, что использование памяти будет увеличиваться при каждом задании, поскольку PhpSpreadsheet должен открывать книгу, которая с каждым разом становится больше. Нет ничего плохого в том, чтобы выделить для этого процесса больше памяти. Кажется, у вас не так много выделенной памяти, поэтому она так быстро переполняется.

Лучше всего опустить ShouldAutoSize как это будет пересчитывать размеры столбцов книги в каждом задании. Это требует гораздо больше памяти, чем без ее использования.

У меня выделено 1 ГБ оперативной памяти и все равно результат такой же, как у саидвазиры.
Только что перешел с v2.1 на v3.1. Была такая же проблема с v2.1, которая побудила меня перейти, но не решила проблему. Excel :: create в версии 2.1 также было намного проще стилизовать вывод.

Кажется, что разбиение на фрагменты не работает при экспорте (с использованием FromQuery) (использует огромный объем памяти - до 3 гигабайт для меня примерно на 200 тыс. Записей). Но импорт отлично работает с разбиением на части. (память никогда не превышает 50 МБ)

У меня всего 15 тысяч записей, и я получил ту же ошибку. Что я могу сделать?

Это ошибка:

[2019-11-24 22:39:59] local.ERROR: Допустимый размер памяти 134217728 байт исчерпан (попытался выделить 18874368 байт) {"исключение": "[объект] (Symfony \ Component \ Debug \ Exception \ FatalErrorException ( code: 1): разрешенный объем памяти 134217728 байт исчерпан (попытка выделить 18874368 байт) в C: \ wamp64 \ www \ ..... \ vendor \ phpoffice \ phpspreadsheet \ src \ PhpSpreadsheet \ Collection \ Cells.php: 421 )
[трассировки стека]

0 {main}

"}

Вам нужно будет увеличить допустимый лимит памяти в вашем php.ini или установить его динамически с помощью ini_set

Был, у меня 1G но не работает

Когда вы запускаете процесс, сколько памяти потребляет процесс php-cli? Тогда он должен превышать 1 гигабайт

Ограничение памяти определенно не проблема. Он установлен на 4 ГБ в соответствии с phpinfo, и у меня все еще есть эта проблема.

у меня такая же проблема

«Решение» будет разбивать ваш файл на несколько, освобождая память между ними, а затем объединяя все файлы и отправляя объединенные в качестве ответа.

Минусы:

  • Больше места для временных файлов
  • Больше времени (не интеллектуальные петли)
  • Требуется дополнительный код (не из коробки)

Плюсы:

  • Оно работает

та же проблема, лимит памяти 512 МБ, строки 4К

Окончательное решение
Это старое, но тот, кто читает это сейчас, должен знать, что
если вы импортируете или экспортируете ToModel или ToCollection, этот процесс требует огромного выделения памяти для преобразования
данные в удобные формы, такие как коллекция или массив.

В этом случае не реализуйте ToModel или ToCollect, вам нужно обойти процесс и выполнить операцию вручную, реализовав OnEachRow.
которые позволяют реализовать метод onRow, который будет передавать объект строки Excel. Вы можете реализовать WithHeadingRow, чтобы он был структурирован как ассоциативный массив.
Используйте эту $ row-> toArray (), чтобы получать данные и обрабатывать их по своему усмотрению. Этим легко и быстро управлять.

PS: Если вы все еще получаете ошибку ограничения памяти, просто добавьте оператор возврата в последнюю строку, как это
возвращение;

Спасибо

У меня была такая же проблема, и с учетом предложений @MoFoLuWaSo я уменьшил использование памяти +128 МБ до 54 МБ.

1) реализовать DTO. Это максимально уменьшило использование памяти.
2) упорядочить свойства DTO и удалить withMapping
3) удалить ShouldAutoSize

В случае @saeedvz это должно выглядеть так:

namespace App\DataTransferObjects;

class OldDepositRow
{
    public int $id;
    public string $created_at;
}

а также

namespace App\Exports;

use App\DataTransferObjects\OldDepositRow;

class OldDepositExport implements FromCollection, ShouldQueue, WithHeadings
{
    use Exportable;

    public function headings(): array
    {
        return [
            'ID',
        ];
    }

    public function collection()
    {
        $users = User::query()
            ->where('status', '=', 1)
            ->select(['id']);

        return $users->map(
           function ($user) {
                $row = new OldDepositRow();
                $row->transaction_id = $user->transaction->id;

                // cast objects like Carbon or BigDecimal to string
                $row->created_at = $user->transaction->created_at->format('d-m-Y');

                return $row;
            }
        );
    }
}
Была ли эта страница полезной?
0 / 5 - 0 рейтинги