Voglio fare una risposta più completa basata sulla maggior parte delle potenziali soluzioni che sono già fornite. Voglio anche sottolineare un ulteriore potenziale aiuto che può aiutare il processo di lettura.
Opzione 1: tipi
"dtypes" è un parametro abbastanza potente che puoi usare per ridurre la pressione di memoria dei read
metodi. Vedi questa e questa risposta. I panda, per impostazione predefinita, provano a dedurre i tipi di dati.
Facendo riferimento alle strutture di dati, ad ogni dato archiviato, avviene un'allocazione di memoria. A livello base fare riferimento ai valori seguenti (La tabella seguente illustra i valori per il linguaggio di programmazione 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
Fare riferimento a questa pagina per vedere la corrispondenza tra i tipi NumPy e C.
Supponiamo che tu abbia una matrice di numeri interi di cifre . È possibile assegnare sia teoricamente che praticamente, diciamo array di tipo intero a 16 bit, ma allocare più memoria di quella necessaria per archiviare tale array. Per evitare ciò, è possibile attivare l' dtype
opzione read_csv
. Non si desidera archiviare gli elementi dell'array come numeri interi lunghi in cui effettivamente è possibile adattarli con numeri interi a 8 bit ( np.int8
o np.uint8
).
Osservare la seguente mappa del tipo.
Fonte: https://pbpython.com/pandas_dtypes.html
Puoi passare un dtype
parametro come parametro sui metodi Panda come dict su read
come {colonna: tipo}.
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)
Opzione 2: lettura di blocchi
La lettura dei dati in blocchi consente di accedere a una parte dei dati in memoria e di applicare la preelaborazione sui dati e preservare i dati elaborati anziché i dati non elaborati. Sarebbe molto meglio se combinassi questa opzione con il primo, i tipi .
Voglio sottolineare le sezioni del libro di cucina di Panda per quel processo, dove puoi trovarlo qui . Nota quelle due sezioni lì;
Opzione 3: Dask
Dask è un framework definito nel sito Web di Dask come:
Dask offre un parallelismo avanzato per l'analisi, consentendo prestazioni su vasta scala per gli strumenti che ami
È nato per coprire le parti necessarie dove i panda non possono raggiungere. Dask è un potente framework che ti consente di accedere molto più ai dati elaborandoli in modo distribuito.
Puoi usare dask per preelaborare i tuoi dati nel loro insieme, Dask si occupa della parte di chunking, quindi a differenza dei panda puoi semplicemente definire le tue fasi di elaborazione e lasciare che Dask faccia il lavoro. Dask non applica i calcoli prima di essere esplicitamente spinto da compute
e / o persist
(vedere la risposta qui per la differenza).
Altri aiuti (idee)
- Flusso ETL progettato per i dati. Mantenere solo ciò che è necessario dai dati grezzi.
- Innanzitutto, applicare ETL a interi dati con framework come Dask o PySpark ed esportare i dati elaborati.
- Quindi verifica se i dati elaborati possono essere inseriti nella memoria nel suo insieme.
- Valuta di aumentare la tua RAM.
- Prendi in considerazione l'idea di lavorare con quei dati su una piattaforma cloud.