Estou recebendo Allowed memory size of 134217728 bytes exhausted
quando tento exportar com a opção FromQuery
Comportamento esperado:
Eu quero consertar meu problema :)
Comportamento real:
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
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]
"}
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:
Prós:
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;
}
);
}
}
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.