Executando verificação de segurança...
10

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!

Carregando publicação patrocinada...
1

Excelente material! Conteúdo de qualidade bem descrito, explicativo e prático. Necessário.

Apenas uma melhoria: considere colocar o nome da linguagem ou a extensão (sem ".") no início do codeblock, isso faz o MD aplicar syntax hilight e facilita a leitura do código:

```py
for i in range(10):
    print(i)
´``
for i in range(10):
    print(i)

De repente poderia ser igualmente interessante o uso de uma tabela para a apresentação dos dados após as transformações, permitindo uma comparação visual mais direta e simples.

Ainda assim volto a reforçar o que comentei inicialmente: excelente material!

1
1

amigo muito bom, obrigado por ter compartilhado mas se me permite uma dica que vai lhe poupar bugs futuros faz um check no tamanho ou no valor pra ver se cabe se não das duas uma ou tu vai ter perda de valor ou exception na cara no melhor caso. no seu caso de uso funcionou

0