Estou usando este pacote há mais de um ano. Recentemente comecei a ter problemas de memória e desempenho. Os usuários estão tentando baixar muitos dados; algumas vezes dados históricos. Então eu li a documentação e encontrei a seção da fila. No início, foi a solução perfeita. Com as exportações enfileiradas, vários trabalhos são despachados para gerar o arquivo por blocos. Mas eu percebi algo. Cada trabalho (AppendQueryToSheet) despachado demorou mais para ser concluído do que o último. E o trabalho final (CloseSheet) demorou ainda mais para ser concluído.
Minha pergunta é: ¿é assim que funciona a exportação enfileirada? Ou eu estou esquecendo de alguma coisa?
Estou usando Redis e Horizon. Mesmo eu tentei com vários trabalhadores, mas parece que toda vez que um trabalho termina, um novo trabalho é despachado. Então, isso não resolveu meu problema.
Anexei esta imagem para vocês verem os horários registrados.
Cada consulta deve reabrir o arquivo de planilha, o que leva algum tempo para a planilha PhpSpreadsheet, portanto, fica mais longo a cada anexo.
Eu tenho algumas mudanças planejadas para o 3.2 que irão melhorar isso.
Estou tendo o mesmo problema aqui. Os tamanhos dos arquivos também não são enormes, apenas 5 a 10 MB. Não estou tendo nenhum pico no uso da CPU ou da memória.
Decidi construir um serviço com python e pandas e melhorou muito, e quero dizer MUITO. Laravel Excel é uma excelente biblioteca, mas eu acho que para este trabalho talvez não seja a ferramenta certa
@ okmkey45 Para ser justo, não é realmente culpa do Laravel Excel, ele depende do PHPSpreadsheet que é uma biblioteca ineficiente para ler / escrever arquivos. É uma pena porque as abstrações em torno de consultas em partes e trabalhos de fila são realmente úteis aqui e me economizam muito tempo escrevendo um serviço em Go / Python e conectando-o à minha fila.
Existem algumas alternativas ao PHPSpreadsheet que são muito mais rápidas em arquivos grandes, talvez eles pudessem ser trocados quando usamos ->queue
ou ShouldQueue
?
@aakarim isso é algo que eu considerei, mas atualmente não tenho tempo ou caso de uso para implementar isso. Eu estaria aberto para um PR, contanto que fosse simples e opcional.
Terei uma festa após este prazo. Existe algum pacote que você prefere / recomenda @patrickbrouwers? https://github.com/box/spout parece um bom lugar para começar.
@aakarim sim caixa / bico. Eu até considerei tornar possível usar liga / csv se você quiser apenas csv, que é de longe a opção mais rápida para grandes importações / exportações em massa.
Comentários muito úteis
Cada consulta deve reabrir o arquivo de planilha, o que leva algum tempo para a planilha PhpSpreadsheet, portanto, fica mais longo a cada anexo.
Eu tenho algumas mudanças planejadas para o 3.2 que irão melhorar isso.