Encontrei um código antigo em um servidor legado que grava a partir de um conjunto de dados de aproximadamente 20 colunas e > 60 mil linhas item por item em um arquivo do Excel usando openpyxl. Ele faz isso preenchendo cada célula por conta própria (da maneira lenta, mas também não tão lenta, pois tudo é feito após alguns minutos e com a formatação das células):
cell = ws.cell('%s%s' % (col_idx, i + 3))
cell.value = unicode(value).encode("utf-8")
get_style(cell, "content", column_colors[col_id])
Em aproximadamente 59 mil linhas, ele trava, o console imprime:
Killed
Os registros mostram:
Received SIGTERM, shutting down.
O SIGTERM sugere muito pouca memória para que o servidor elimine a tarefa "de fora". É uma máquina virtual. A verificação da memória com o comando free
mostra que todos os 3,5 GB livres são usados gravando esse pequeno conjunto de dados (20 MB no servidor) no Excel.
Verifiquei na corrida e encontrei: 500 MB apenas para configurar o arquivo, 700 MB a cada 10K linhas. Escrever o conjunto de dados leva a:
60 x 700 + 500 = 4700 MB de RAM livre necessários e a VM tem apenas 3,5 GB. O que deve ser suficiente para um arquivo tão pequeno na saída. A saída no final é aproximadamente uma pasta de trabalho de 20 MB. A versão de saída do Excel deve ser 2007 ou 2010, pois está sendo executada em Python 2.73 e em código legado desatualizado.
Por que escrever em uma pasta de trabalho de 20 MB com o módulo openpyxl do Python consome Gigabytes de RAM?
Que o openpyxl requer muita RAM para ler/gravar arquivos do Excel é conhecido:
De acordo com a documentação do openpyxl sobre desempenho, o uso geral da RAM pode ser calculado dessa maneira.
No seu caso o valor parece ser ainda maior pode ser seu uso ser diferente ou os valores da documentação estarem desatualizados.
Mas a documentação também contém dicas de como otimizar , reduzindo assim o uso de RAM:
Instale o pacote Python lxml - se esse pacote estiver instalado, ele será usado. É especialmente recomendado ao escrever arquivos Excel "grandes".
Usar o modo somente gravação