Como Reduzi em 63% o Uso de Memória de um DataFrame no Python – Otimizando Processos e Melhorando Resultados
Trabalhar com grandes volumes de dados é sempre um desafio, especialmente quando o uso de memória se torna um gargalo no processamento. Recentemente, me deparei com um problema envolvendo um DataFrame de mais de 6,3 milhões de linhas e 17 colunas, que consumia 800 MB de memória. Nesse artigo, compartilho como consegui reduzir esse uso para apenas 293 MB, uma economia de 63%, utilizando técnicas simples, mas eficazes, de otimização no Python.
O Problema Inicial
Ao trabalhar com esse DataFrame, percebi que a memória utilizada estava impactando a performance do meu código e comprometendo o processamento de dados. O DataFrame apresentava os seguintes tipos de dados:
Object: 10 colunas, consumindo grande parte da memória devido à representação de strings.
Float64: 4 colunas, usando mais memória do que o necessário para a precisão requerida.
Int64: 1 coluna, com potencial para ser otimizada.
Com esses tipos de dados, meu DataFrame era funcional, mas ineficiente. A solução era clara: otimizar os tipos de dados.
A Solução
Para resolver o problema, desenvolvi uma função no Python que identifica e converte os tipos de dados de forma automática, reduzindo drasticamente o consumo de memória. Aqui está o que fiz:
Conversão de object para category:
Colunas do tipo object geralmente consomem muita memória porque armazenam cada string individualmente. Convertendo-as para category, o Pandas armazena apenas os valores únicos e cria índices para representá-los.
Conversão de float64 para float32:
Float32 usa metade da memória de float64 e é suficiente para a maioria dos casos onde não é necessária alta precisão.
Conversão de int64 para int32:
Colunas inteiras também podem ser reduzidas pela metade no uso de memória, utilizando int32 ao invés de int64.
A Função de Otimização
Aqui está o código que utilizei para otimizar meu DataFrame:
import pandas as pd
def optimize_dataframe(df):
# Converter colunas Object para Category
for col in df.select_dtypes(include='object').columns:
df[col] = df[col].astype('category')
#Converter colunas Float64 para Float32
for col in df.select_dtypes(include='float64').columns:
df[col] = df[col].astype('float32')
#Converter colunas Int64 para Int32
for col in df.select_dtypes(include='int64').columns:
df[col] = df[col].astype('int32')
return df
O Resultado
Após aplicar a função, os resultados foram impressionantes:
Antes da Otimização:
Uso de memória: 800.6 MB
Tipos de dados:
object: 10 colunas
float64: 4 colunas
int64: 1 coluna
Após a Otimização:
Uso de memória: 293.5 MB
Tipos de dados:
category: 10 colunas
float32: 4 colunas
int32: 2 colunas
A memória foi reduzida em 63%, tornando o DataFrame muito mais eficiente para manipulação e análise.
Benefícios
Melhora no Desempenho:
Operações no DataFrame ficaram significativamente mais rápidas.
Maior Escalabilidade:
Agora posso trabalhar com conjuntos de dados maiores no mesmo ambiente.
Economia de Recursos:
Uso reduzido de memória RAM, permitindo que outros processos rodem de forma mais eficiente.
Conclusão
Otimizar os tipos de dados em um DataFrame é uma solução simples, mas extremamente eficaz, para lidar com grandes volumes de dados. Pequenas alterações no código podem ter um impacto enorme no desempenho e na eficiência do seu workflow.
Se você trabalha com grandes volumes de dados, recomendo revisar os tipos de dados do seu DataFrame e aplicar técnicas de otimização como essas. Os resultados falam por si!
Gostou desse artigo? Comente aqui ou me mande uma mensagem para discutirmos mais sobre otimização e boas práticas no tratamento de dados!