In questo Articolo vedremo diversi modi per gestire grandi dataset con Python, in particolare confronteremo i formati e le strutture di CSV, Pickle, Parquet, Feather e HDF5.
Perchè bisogna saper gestire grandi dataset ?
Rispondiamo a questa domanda con un semplice episodio accaduto qualche tempo fa...
Quando Kaggle ha finalmente lanciato una nuova competizione di dati tabulari dopo tutto tanto tempo, tutti si sono emozionati. Fino a quando non si sono resi conto di un piccolo dettaglio.
Quando i Kaggler hanno scoperto che il set di dati era grande 50 GB, la comunità ha iniziato a discutere su come gestire set di dati così grandi.
Il formato di file CSV richiede molto tempo per scrivere e leggere set di dati di grandi dimensioni e non riconosce i tipi di dati se non esplicitamente indicato.
Oltre a ridurre lo spazio su disco richiesto riducendo i tipi di dati, la domanda era in quale formato salvare il set di dati modificato tra le sessioni di lavoro.
Questo articolo esplora quattro alternative al formato di file CSV per la gestione di dataset di grandi dimensioni: Pickle, Feather, Parquet e HDF5. Inoltre, esamineremo questi formati di file con la compressione.
Questo articolo esplora i formati di file alternativi con la libreria Pandas.
Ora potresti pensare "Perché non dovrei usare pandas quando lavori con set di dati di grandi dimensioni?"
Questa è una domanda giusta. Sebbene un'alternativa a pandas come Datatable sarebbe più veloce nella lettura e nella scrittura di file CSV, il vantaggio di pandas è che offre molta flessibilità per l'elaborazione dei dati. Inoltre, pandas supporta la lettura e la scrittura di molti formati di file pronti all'uso. Ancora una volta, un'alternativa come Datatables supporta solo i formati CSV, Jay, XLSX e testo normale.
Ambiente di Lavoro per gestire grandi dataset con Python
Ai fini del benchmarking, creeremo un set di dati fittizio. Questo set di dati fittizio contiene una colonna di ogni tipo di dati con le seguenti eccezioni: Colonne con il tipo di dati float16e categoricol vengono omesse per questo esempio perché parquet non supporta float16e HDF5 con format = "table"non supporta tipi categorici.
Per ridurre il rumore temporale per la comparabilità, questo set di dati fittizio contiene 10.000.000 di righe ed è grande quasi 1 GB.
Le caratteristiche dei dati possono influire sui tempi di lettura e scrittura, ad esempio i tipi di dati, la larghezza (numero di colonne) rispetto alla lunghezza (numero di righe) di DataFrame. Tuttavia, questo va oltre lo scopo di questo articolo.
Panoramica dei formati di file per gestire grandi dataset con Python
In questa sezione, toccheremo brevemente alcune caratteristiche chiave per ciascun formato di file: descrizione breve, estensione del file, compressione utilizzata e metodi di lettura e scrittura dei panda.
Gestire grandi dataset con Python -
Valori separati da virgola (CSV)
Un file di testo che utilizza una virgola per separare i valori. L'estensione del file è .csv.
In questo articolo useremo la compressione gzip.
# Lettura
df = pd.read_csv(file_name, dtype = {...})
# Scrittura
df.to_csv(file_name, index = False, compression = ...) # None o "gzip"
Gestire grandi dataset con Python -
Pickle
pickle è un modulo implementa protocolli binari per serializzare e deserializzare una struttura di oggetti Python. L'estensione del file è .pkl.
In questo articolo useremo la compressione gzip.
nome_file = "dataset.pkl"
# Lettura
df = pd.read_pickle( nome_file )
# Scrittura
df.to_pickle(nome_file, compression = ...) # Nessuno o "gzip
Gestire grandi dataset con Python -
Parquet
Apache Parquet è un formato di archiviazione a colonne disponibile per qualsiasi progetto nell'ecosistema Hadoop, indipendentemente dalla scelta del framework di elaborazione dati, del modello di dati o del linguaggio di programmazione.
L'estensione del file è .parquet.
In questo articolo utilizzeremo il motore pyarrow e la compressione gzip.
# Lettura
df = pd.read_parquet( nome_file )
# Scrivendo
df. to_parquet( nome_file , engine = "pyarrow", compression = ...)
# Nessuno o "gzip"
Gestire grandi dataset con Python -
Feather
Feather è un formato di file portatile per la memorizzazione di tabelle Arrow o frame di dati (da linguaggi come Python o R) che utilizza internamente il formato Arrow IPC . Feather è stato creato all'inizio del progetto Arrow come prova del concetto per l'archiviazione di frame di dati veloce e indipendente dal linguaggio per Python (panda) e R. L'estensione del file è .feather.
Poiché la compressione gzip non è disponibile per il formato Feather, utilizzeremo invece la compressione zstd.
# Lettura
df = pd.read_feather(nome_file)
# Scrittura
df.to_feather(nome_file, compression = ...) # Nessuno o "zstd"
Gestire grandi dataset con Python -
Formato dati gerarchico (HDF5)
HDF5 è un modello di dati, una libreria e un formato di file per l'archiviazione e la gestione dei dati. Supporta una varietà illimitata di tipi di dati ed è progettato per I/O flessibili ed efficienti e per volumi elevati e dati complessi. HDF5 è portatile ed estensibile, consentendo alle applicazioni di evolversi nell'uso di HDF5.
L'estensione del file è .h5.
HDF5 ha due opzioni di formato:
"fixed", veloce nello scrivere
"table", che è più lento ma offre "operazioni flessibili come la ricerca/selezione di sottoinsiemi di dati"
Per leggere e scrivere file HDF5 è necessario installare tables.
Poiché la compressione gzip non è disponibile per il formato piuma, utilizzeremo invece la compressione zlib.
# Lettura
df = pd. read_hdf( nome_file )# Scrittura
df.to_hdf(nome_file,
key = "df",
format = ..., # "fixed" o "table"
complib = ..., # Nessuno o "zlib"
complevel = 9)
Confronto tra i metodi per Gestire grandi dataset con Python
Questa sezione confronta i cinque formati di file in base al tempo di scrittura, alla dimensione del file, al tempo di lettura e a caratteristiche varie come leggibilità umana, coerenza, tempo di archiviazione e portabilità previsti e prestazioni su set di dati di piccole dimensioni.
Confronto tempi di scrittura tra i metodi per Gestire grandi dataset con Python
Di seguito, puoi vedere il tempo necessario per scrivere il file per ciascun formato di file. Le barre nere continue indicano i tempi di scrittura per i file non compressi, mentre le barre con hash indicano i tempi di scrittura per i file compressi.
Per prima cosa, affrontiamo l'elefante nella stanza: la compressione aumenta il tempo di scrittura di qualsiasi formato di file . Ma questo non dovrebbe sorprendere in quanto la compressione dei dati è un'attività aggiuntiva durante il processo di scrittura.
Inoltre, possiamo fare le seguenti osservazioni:
Come previsto, per CSV la scrittura richiede più tempo
Feather e Parquet hanno i tempi di scrittura non compressi più rapidi
Feather ha il tempo di scrittura più veloce sia per i file non compressi che per quelli compressi
Come previsto, HDF5 con format = "fixed"è più veloce diformat = "table" , ma con la compressione HDF5 con format = "fixed"è simile a format = "table"
Dimensioni dei file
Di seguito, puoi vedere le dimensioni dei file risultanti per ciascun formato di file. Le barre nere continue indicano le dimensioni dei file per i file non compressi, mentre le barre con hash indicano le dimensioni dei file per i file compressi.
Possiamo fare le seguenti osservazioni:
Come previsto, i file compressi sono più piccoli dei file non compressi
CSV è il file più grande
Parquet è il file non compresso più piccolo
Parquet e HDF5 con sono i file format = "table"compressi più piccoli
Momento della lettura
Di seguito, puoi vedere il tempo necessario per leggere il file per ciascun formato di file. Le barre nere continue indicano i tempi di lettura per i file non compressi, mentre le barre con hash indicano i tempi di lettura per i file compressi.
Possiamo fare le seguenti osservazioni:
Come previsto, per CSV la lettura richiede tempi lunghi
Pickle e HDF5 format = "fixed"hanno i tempi di lettura più rapidi sia per i file non compressi che per quelli compressi
Come previsto, HDF5 con format = "fixed"è più veloce diformat = "table" , anche con compressione
Varie
Oltre ai tempi di lettura e scrittura e alle dimensioni dei file, dovremmo anche considerare alcune caratteristiche in più: leggibilità umana, coerenza, tempo di archiviazione e portabilità previsti e prestazioni su set di dati di piccole dimensioni.
Leggibilità umana
CSV è l'unico formato di file leggibile da un essere umano. Tutti i formati di file alternativi sono formati binari e quindi non leggibili dagli esseri umani.
Consistenza
A meno che tu non indichi esplicitamente il .read_csv()metodo con quale tipo di dati leggere ogni colonna, il formato del file CSV non ricorda i tipi di dati. Ciò richiede una conoscenza preliminare dei tipi di dati ed è anche uno sforzo aggiuntivo.
Se i tipi di dati non sono elencati in modo esplicito nel metodo di lettura, ciò può comportare un aumento dello spazio di archiviazione richiesto poiché tutti i numeri interi vengono letti come int64, tutti i float vengono letti come float64e datetime64[ns]e categoricalvengono letti come object. Di seguito, puoi vedere il DataFrame originale e il DataFrame dopo aver scritto e letto da un file CSV:
Come puoi vedere, a causa del casting dei tipi di dati più piccoli in tipi di dati più grandi, l'utilizzo della memoria richiesto aumenta.
Tempo di conservazione e portabilità
Pickle e Feather sono destinati alla conservazione a breve termine. Pickle è destinato al salvataggio di oggetti Python tra sessioni di lavoro e quindi è supportato solo da Python. Feather è destinato allo scambio di dati tra Python e R . Anche Pickle e Feather non sono garantiti per essere stabili tra le versioni.
Prestazioni su piccoli set di dati
Sebbene questo articolo si concentri su set di dati di grandi dimensioni, è degno di nota menzionare gli scarsi tempi di lettura e scrittura del formato HDF5 per set di dati di piccole dimensioni. Come mostrato di seguito, la lettura di un file HDF5 richiede anche più tempo di un file CSV se il set di dati è inferiore a 2 MB.
La tabella seguente riassume il confronto di questa sezione:
Conclusione sui metodi per Gestire grandi dataset con Python
Come previsto, il formato di file CSV è il più lento sia nella lettura che nella scrittura del file. A meno che tu non stia ottimizzando per la dimensione del file, tutte le alternative sono all'incirca solo la metà del formato di file CSV.
Sfortunatamente, la domanda da un milione di dollari ha una risposta insoddisfacente:
"Qual è il formato migliore per gestire set di dati di grandi dimensioni?"
— "Dipende dal tuo caso d'uso ma probabilmente non CSV"
Ecco il mio tentativo di dimostrare un po' più di dettagli per la parte "Dipende" di questa risposta. Sono interessato a sentire il tuo contributo in merito.
Nonostante i suoi svantaggi, CSV è ampiamente utilizzato. Sembra che il fatto che sia leggibile dall'uomo e non un formato di file binario lo renda un formato di file intuitivo, che puoi aprire rapidamente e dare un'occhiata senza problemi. Quindi, a meno che tu non stia lavorando con più Gigabyte di dati, CSV è ancora un'opzione accettabile.
Comments