AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 1109013
Accepted
questionto42standswithUkraine
questionto42standswithUkraine
Asked: 2022-08-25 11:07:07 +0800 CST2022-08-25 11:07:07 +0800 CST 2022-08-25 11:07:07 +0800 CST

Por que escrever em uma pasta de trabalho de alguns MB com o módulo openpyxl do Python consome Gigabytes de RAM?

  • 772

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 freemostra 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?

python
  • 0 0 respostas
  • 57 Views

0 respostas

  • Voted
  1. Best Answer
    Robert
    2022-08-26T08:57:55+08:002022-08-26T08:57:55+08:00

    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.

    O uso de memória é bastante alto em comparação com outras bibliotecas e aplicativos e é aproximadamente 50 vezes o tamanho do arquivo original, por exemplo, 2,5 GB para um arquivo Excel de 50 MB.

    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:

    1. Instale o pacote Python lxml - se esse pacote estiver instalado, ele será usado. É especialmente recomendado ao escrever arquivos Excel "grandes".

    2. Usar o modo somente gravação

    • 1

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve