Como Cientista de Dados, é bastante comum ter que lidar com “Big Data”, que corresponde a conjuntos de dados que, embora possam não ser tão grandes, são grandes o suficiente para fazer um computador lutar para processá-los.
Este problema não é novo e, como em tudo, não existe uma fórmula mágica de tamanho único. O melhor método dependerá dos seus dados e do seu objetivo final.
No entanto, as soluções mais populares geralmente se enquadram em uma das categorias descritas abaixo, estratégias para trabalhar com grandes conjuntos de dados em Linguagem Python.
1- Reduza o uso de memória otimizando os tipos de dados
Ao usar o Pandas para carregar dados, ele inferirá automaticamente os tipos de dados, a menos que seja informado o contrário. Na maioria das vezes isso funcionará bem, mas o tipo inferido não é necessariamente otimizado. Além disso, se uma coluna numérica contiver valores ausentes, o tipo inferido será automaticamente flutuante, aumentando o espaço ocupado na memória do computador.
Para esse caso em particular, especificar os tipos de dados pode levar a uma importante redução da memória utilizada. Usar o tipo Pandas pandas.Int16Dtype para forçar uma coluna contendo valores ausentes a ser do tipo int pode ser uma boa solução. Isso é alcançado internamente usando pandas.NA em vez de numpy.nan para os valores ausentes.
Otimizar dtypes ao lidar com grandes conjuntos de dados requer já ter algum conhecimento prévio dos dados com os quais você está lidando. Pode não ser útil em uma fase puramente exploratória de um conjunto de dados desconhecido.
2- Divida os dados em partes
Quando os dados são muito grandes para caber na memória, você pode usar a opção chunksize do Pandas para dividir os dados em pedaços em vez de lidar com um grande bloco. O uso dessa opção cria um objeto iterador que pode ser usado para percorrer os diferentes fragmentos e realizar filtragem ou análise como faria ao carregar o conjunto de dados completo.
Chunking pode ser usado desde a análise exploratória inicial até o treinamento de um modelo de Machine Learning e requer muito pouca configuração extra.
3- Aproveite a lazy evaluation
A avaliação preguiçosa (lazy evaluation) refere-se à estratégia que atrasa a avaliação de uma expressão até que o valor seja realmente necessário. Lazy evaluation é um conceito importante (usado especialmente em programação funcional).
A avaliação preguiçosa é a base sobre a qual estruturas de computação distribuída, como Spark ou Dask, são construídas. Embora eles tenham sido projetados para funcionar em clusters, você ainda pode aproveitá-los para lidar com grandes conjuntos de dados em seu computador pessoal.
A principal diferença em relação aos Pandas é que eles não carregam os dados diretamente na memória. Em vez disso, o que acontece durante o comando de leitura é que eles verificam os dados, inferem dtypes e os dividem em partições. Grafos computacionais são construídos para essas partições de forma independente e são executados apenas quando realmente necessário (daí a preguiça).
A sintaxe do Dask, por exemplo, imita o Pandas, por isso parecerá muito familiar, no entanto, é limitado ao uso em Python, enquanto o Spark também funcionará em Java ou Scala.
Outras bibliotecas, como Vaex ou Modin, oferecem recursos semelhantes.
David Matos
Referências: