Primeira vez aqui? Seja bem vindo e cheque o FAQ!
x

Qual a forma mais eficiente em termos de memória de salvar e carregar dicionários/dataframes grandes no Python?

+1 voto
85 visitas
perguntada Mar 2 em Programação Computacional por Stuart Mill (1,404 pontos)  

A forma mais simples e menos eficiente, por exemplo, seria de salvar os dados em .txt. Em geral, você gostaria de alguma forma de serialização para isso. Alguns formatos não permitem serializar certos tipos de objeto (por exemplo, timestamps).

Algumas bibliotecas com as quais me deparei, por exemplo, foram joblib, pickle e json. O pickle por exemplo permite carregar pequenos pedaços do dicionário e ir juntando, de modo a não estourar a memória.

Tem alguma forma/biblioteca preferida de lidar com isso?

Compartilhe

2 Respostas

+1 voto
respondida Mar 3 por danielcajueiro (5,581 pontos)  

Quando vc está trabalhando realmente com grandes bases, provavelmente você não pretende abrir os arquivos em excel ou algo similar, que seria o único motivo para salvar no csv. A forma natural seria criar uma aplicação em base de dados. A mais natural seria SQL. Existem ferramentas que funcionam bem dentro de python e é relativamente simples trabalhar com elas.

Existem algumas formas para lidar com SQL:

1) SQLite (sqlite3)

2) Python SQL driver (mysql-connector-python)

3) PostgreSQL (psycopg2)

4) SQLAlchemy (beautiful solution)

comentou Mar 3 por Stuart Mill (1,404 pontos)  
Obrigado pelas sugestões!

No caso, a  ideia não é exatamente lidar com uma base de dados grande somente (embora também seja o caso), mas também salvar objetos grandes gerados/processados pelo meu programa (por exemplo, um dicionário de dicionários ou dataframe contendo objetos que não necessariamente podem ser salvos de forma direta). De qualquer forma, vou dar uma olhada nessa solução de SQL.

Quando eu leio arquivos .dta grandes, o pandas parece não lidar bem em termos de memória. Quase sempre demora para carregar e o uso de memória fica no limite. Quando eu faço o carregamento por pedaços, aí em geral funciona bem. É um pouco estranho, porque no Stata ele carrega rápido e sem muito uso de memória (provavelmente está carregando só alguns pedaços de cada vez também por trás).
comentou Mar 7 por danielcajueiro (5,581 pontos)  
Entendi, não tenho certeza. Será que é o formato do arquivo dta? Que nao esta otimizado. Honestamente nem conheço esse formato. Sempre uso csv. Acho que ele funciona bem. Mas se sua base realmente for muito grande, as vezes é melhor ler apenas parte das colunas.
comentou Mar 8 por Stuart Mill (1,404 pontos)  
editado Mar 11 por Stuart Mill
O dta é o formato do Stata, também não sou muito habituado e não sei como funciona. No stata ele lê bem rápido, mas quando faço a conversão com o pandas, geralmente é bem mais lento e estoura a memória. Eu também em geral uso o csv, mas alguns objetos acho que não dá pra exportar em csv. Por exemplo, se eu tiver um dicionário de dicionários, acho que o csv não vai funcionar muito bem... O json por exemplo funcionaria melhor nesse caso, mas mesmo assim, alguns objetos que possivelmente estão dentro desse dicionário não conseguem ser "desserializados" para json!

**Update:** De fato parece haver um problema com o formato dta no pandas... Lendo em dta em salvando em csv, por exemplo (em casos onde isso é possível) e depois lendo direto do csv parece produzir resultados bem melhores!
0 votos
respondida Mar 11 por Stuart Mill (1,404 pontos)  

Para quem quiser uma referência dos custos de diferentes métodos:
A imagem será apresentada aqui.

Uma boa referência para esse assunto pode ser encontrada nesta pergunta do stackoverflow, onde tem uma discussão sobre as diferentes formas de serialização no Python e seus custos computacionais.

...