Laravel-excel: Tamanho de memória permitido de 134217728 bytes esgotados

Criado em 19 jul. 2018  ·  22Comentários  ·  Fonte: Maatwebsite/Laravel-Excel

Pré-requisitos

  • [X] Capaz de reproduzir o comportamento fora do seu código, o problema é isolado no Laravel Excel.
  • [X] Verificou se seu problema ainda não foi arquivado.
  • [X] Foi verificado se nenhum PR foi enviado para corrigir este problema.

Versões

  • Versão PHP: 7.1.13
  • Versão do Laravel: 5.6
  • Versão do pacote: ^ 3.0

Descrição

Estou recebendo Allowed memory size of 134217728 bytes exhausted quando tento exportar com a opção FromQuery

Passos para reproduzir

Comportamento esperado:

Eu quero consertar meu problema :)

Comportamento real:

Informações adicionais

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']);
    }
}

Veja esta imagem https://i.imgur.com/yMgUqXP.jpg

Comentários muito úteis

De quem você espera uma resposta?

Nosso software é gratuito e de código aberto, o que significa que o uso de nosso software é opcional. Não nos responsabilizamos e não temos obrigação de oferecer suporte. Forneceremos suporte com base nos melhores esforços.

Se você usa o software comercialmente e precisa de suporte elaborado ou precisa com urgência, podemos oferecer isso em uma base comercial. Entre em contato com [email protected] ou pelo telefone +31 (0) 10 744 9312.

Todos 22 comentários

Alguém pode me ajudar?

4 dias. sem resposta :-(

De quem você espera uma resposta?

Nosso software é gratuito e de código aberto, o que significa que o uso de nosso software é opcional. Não nos responsabilizamos e não temos obrigação de oferecer suporte. Forneceremos suporte com base nos melhores esforços.

Se você usa o software comercialmente e precisa de suporte elaborado ou precisa com urgência, podemos oferecer isso em uma base comercial. Entre em contato com [email protected] ou pelo telefone +31 (0) 10 744 9312.

OK, por favor, não feche este problema. talvez alguém possa consertar isso.

Obrigado

Acho que é um problema de memória php, talvez seja muito dado e estoure a memória ... Não tem relação com a biblioteca.

@jlcarpioe Tenho quase

Você tentou maximizar memory_limit no php.ini?

@ bagana89 Isso não é uma boa solução

Não consigo reproduzir o seu problema. Consigo exportar uma tabela de usuários de 300 mil linhas usando o código que você compartilhou. Observe que o uso de memória aumentará a cada trabalho, pois o PhpSpreadsheet tem que abrir a pasta de trabalho que está ficando maior a cada vez. Não há nada de errado em atribuir um pouco mais de memória para esse processo. Parece que você não tem muita memória atribuída, por isso ela transborda tão rápido.

Melhor descartar ShouldAutoSize pois isso irá recalcular as dimensões da coluna das pastas de trabalho em cada trabalho. Isso consome muito mais memória do que sem usá-la.

Eu tenho 1 GB de RAM alocado e ainda tenho o mesmo resultado que saeedvaziry.
Acabei de migrar de v2.1 para v3.1. Estava tendo o mesmo problema com a v2.1 que me motivou a migrar, mas não resolveu o problema. O Excel :: create na v2.1 também foi muito mais fácil de estilizar a saída.

Parece que a fragmentação não funciona bem ao exportar (usando FromQuery) (usa uma grande quantidade de memória - até 3 Gigs para mim para cerca de 200k registros). Mas a importação funciona bem com o chunking. (a memória nunca excede 50 MB)

Tenho apenas 15 mil registros e me deu o mesmo erro. O que posso fazer?

Este é o erro:

[2019-11-24 22:39:59] local.ERROR: Tamanho de memória permitido de 134217728 bytes esgotados (tentou alocar 18874368 bytes) {"exception": "[object] (Symfony \ Component \ Debug \ Exception \ FatalErrorException ( código: 1): Tamanho de memória permitido de 134217728 bytes esgotados (tentativa de alocar 18874368 bytes) em C: \ wamp64 \ www \ ..... \ vendor \ phpoffice \ phpspreadsheet \ src \ PhpSpreadsheet \ Collection \ Cells.php: 421 )
[stacktrace]

0 {main}

"}

Você precisará aumentar o limite de memória permitido em seu php.ini ou configurá-lo dinamicamente usando ini_set

Sim, tenho 1G mas não funciona

Quando você executa o processo, quanta memória o processo php-cli consome? Deve ser superior a 1 GB então

O limite de memória definitivamente não é o problema. Ele está definido para 4 GB de acordo com phpinfo e ainda tenho esse problema.

eu tenho o mesmo problema

Uma 'Solução' seria dividir seu arquivo em vários, liberando memória entre eles e, em seguida, mesclar todos os arquivos e enviar mesclados como resposta.

Contras:

  • Mais espaço para arquivos temporários
  • Mais tempo gasto (loops não inteligentes)
  • Mais código necessário (não pronto para uso)

Prós:

  • Funciona

o mesmo problema, o limite de memória é 512 MB, 4 K linhas

Solução final
Isso é antigo, mas quem está lendo isso agora deve saber que
se você estiver importando ou exportando ToModel ou ToCollection, esse processo requer grande alocação de memória para converter
os dados em formas utilizáveis ​​como coleção ou array.

Nesse caso, não implemente ToModel ou ToCollect, você precisa ignorar o processo e realizar a operação manualmente implementando OnEachRow
que permite implementar o método onRow que passará em um objeto Excel Row. Você pode implementar o WithHeadingRow para que seja estruturado como uma matriz associativa.
Use este $ row-> toArray () para obter seus dados e processá-los como desejar. Isso é rápido e fácil de manipular.

PS: se você ainda receber o erro de limite de memória, basta adicionar uma instrução de retorno à última linha como esta
Retorna;

Obrigada

Eu tive o mesmo problema e com as sugestões de @MoFoLuWaSo eu reduzi meu uso de memória de + 128Mb para 54Mb.

1) implementar um DTO. Isso reduziu ao máximo o uso de memória.
2) ordenar as propriedades do DTO e remover withMapping
3) remover ShouldAutoSize

No caso de @saeedvz , deve ser assim:

namespace App\DataTransferObjects;

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

e

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;
            }
        );
    }
}
Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

contifico picture contifico  ·  3Comentários

alejandri picture alejandri  ·  3Comentários

gamevnlc picture gamevnlc  ·  3Comentários

amine8ghandi8amine picture amine8ghandi8amine  ·  3Comentários

disto picture disto  ·  3Comentários