Desejo fazer uma resposta mais abrangente com base na maioria das soluções possíveis que já são fornecidas. Também quero apontar mais uma ajuda potencial que pode ajudar no processo de leitura.
Opção 1: tipos
"dtypes" é um parâmetro bastante poderoso que você pode usar para reduzir a pressão de memória dos read
métodos. Veja esta e esta resposta. Os pandas, por padrão, tentam inferir tipos de dados.
Referindo-se a estruturas de dados, todos os dados armazenados, uma alocação de memória ocorre. Em um nível básico, consulte os valores abaixo (A tabela abaixo ilustra os valores da linguagem de programação C):
The maximum value of UNSIGNED CHAR = 255
The minimum value of SHORT INT = -32768
The maximum value of SHORT INT = 32767
The minimum value of INT = -2147483648
The maximum value of INT = 2147483647
The minimum value of CHAR = -128
The maximum value of CHAR = 127
The minimum value of LONG = -9223372036854775808
The maximum value of LONG = 9223372036854775807
Consulte esta página para ver a correspondência entre os tipos NumPy e C.
Vamos dizer que você tem um array de inteiros de dígitos . Você pode atribuir teoricamente e praticamente, por exemplo, matriz do tipo inteiro de 16 bits, mas alocaria mais memória do que realmente precisa para armazenar essa matriz. Para evitar isso, você pode ativar a dtype
opção read_csv
. Você não deseja armazenar os itens da matriz como um número inteiro longo onde, na verdade, você pode ajustá-los com um número inteiro de 8 bits ( np.int8
ou np.uint8
).
Observe o seguinte mapa de tipo.
Fonte: https://pbpython.com/pandas_dtypes.html
Você pode passar o dtype
parâmetro como um parâmetro nos métodos de pandas como ditado read
como {column: type}.
import numpy as np
import pandas as pd
df_dtype = {
"column_1": int,
"column_2": str,
"column_3": np.int16,
"column_4": np.uint8,
...
"column_n": np.float32
}
df = pd.read_csv('path/to/file', dtype=df_dtype)
Opção 2: Leia por Chunks
A leitura dos dados em partes permite acessar uma parte dos dados na memória e você pode aplicar o pré-processamento aos dados e preservar os dados processados em vez dos dados brutos. Seria muito melhor se você combinar essa opção com o primeiro, dtypes .
Quero destacar as seções do livro de receitas dos pandas para esse processo, onde você pode encontrá-lo aqui . Observe essas duas seções lá;
Opção 3: Dask
O Dask é uma estrutura definida no site da Dask como:
O Dask fornece paralelismo avançado para análises, permitindo desempenho em escala para as ferramentas que você ama
Nasceu para cobrir as partes necessárias onde os pandas não podem alcançar. O Dask é uma estrutura poderosa que permite muito mais acesso a dados, processando-o de maneira distribuída.
Você pode usar o dask para pré-processar seus dados como um todo. O Dask cuida da parte do chunking. Assim, ao contrário dos pandas, você pode apenas definir suas etapas de processamento e deixar o Dask fazer o trabalho. O Dask não aplica os cálculos antes de ser explicitamente enviado por compute
e / ou persist
(veja a resposta aqui para a diferença).
Outras ajudas (ideias)
- Fluxo ETL projetado para os dados. Mantendo apenas o que é necessário a partir dos dados brutos.
- Primeiro, aplique ETL a dados inteiros com estruturas como Dask ou PySpark e exporte os dados processados.
- Então veja se os dados processados podem caber na memória como um todo.
- Considere aumentar sua RAM.
- Considere trabalhar com esses dados em uma plataforma em nuvem.