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

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
0