top of page

Come gestire grandi dataset con Python

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.



Come gestire grandi dataset con Python
Come gestire grandi dataset con Python


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.



Come gestire grandi dataset con Python
Come gestire grandi dataset con Python

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.

Come gestire grandi dataset con Python
Come gestire grandi dataset con Python

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.

Come gestire grandi dataset con Python
Come gestire grandi dataset con Python

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.

Come gestire grandi dataset con Python
Come gestire grandi dataset con Python

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 gestire grandi dataset con Python
Come gestire grandi dataset con Python

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.


Come gestire grandi dataset con Python
Come gestire grandi dataset con Python

La tabella seguente riassume il confronto di questa sezione:


Come gestire grandi dataset con Python
Come gestire grandi dataset con Python

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.


Come gestire grandi dataset con Python
Come gestire grandi dataset con Python

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.


PCR (5).gif
PCR (4).gif
PCR.gif
PCR.gif
PCR.gif
PCR.gif
PCR (5).gif
3.gif
Vediamo se riesci a cliccarmi ! Nascondo una Sorpresa... (2).png

Ciao 

🤗 Articoli consigliati dalla nostra
Intelligenza Artificiale in base ai tuoi interessi

Correlazione Alta

Correlazione Media

Correlazione Bassa

Iscriviti

VUOI DIVENTARE UN MEMBRO DI INTELLIGENZA ARTIFICIALE ITALIA GRATUITAMENTE E TRARNE I SEGUENTI BENEFICI?

Corsi Gratis

più di 150 lezioni online

Dataset Gratis

più di 150o dataset

Ebook Gratis

più di 10 libri da leggere

Editor Gratis

un editor python online

Progetti Gratis

più di 25 progetti python

App Gratis

4 servizi web con I.A.

Unisciti Ora a oltre
1.000.000
di lettori e appassionanti d'I.A.

Tutto ciò che riguarda l'intelligenza Artificiale, in unico posto, in italiano e gratis.

MEGLIO DI COSI' NON SI PUO' FARE

Dopo l'iscrizione riceverai diversi Regali

VUOI SCRIVERE ARTICOLI INSIEME A NOI.

Grazie

bottom of page