2016-05-03 9 views
17

Sto provando a caricare un file csv, che è 250 MB. In pratica 4 milioni di righe e 6 colonne di dati di serie temporali (1min). La procedura normale è:Qual è il modo più veloce per caricare un grande file CSV in un notebook per lavorare con i panda Python?

location = r'C:\Users\Name\Folder_1\Folder_2\file.csv' 
df = pd.read_csv(location) 

Questa procedura richiede circa 20 minuti !!!. Molto preliminare Ho esplorato le seguenti opzioni

Mi chiedo se qualcuno ha confrontato queste opzioni (o più) e c'è un chiaro vincitore . Se nessuno risponde, in futuro posterò i miei risultati. Non ho tempo proprio adesso.

+3

Sarebbe utile capire la struttura dei dati, a volte specificando in anticipo i dtypes aiuta con 'read_csv' – EdChum

+1

Questo sembra essere un [duplicato] (http://stackoverflow.com/questions/25508510/fastest-way- to-parse-grandi-CSV-files-in-panda). –

+1

Su hdf5 vs '.read_csv()' esigenze di velocità e spazio, vedi http://stackoverflow.com/questions/16639877/hdf5-taking-more-space-than-csv – Stefan

risposta

26

Ecco i risultati del confronto tra lettura e scrittura per DF (forma: 4000000 x 6, dimensione in memoria 183,1 MB, dimensione CSV non compresso - 492 MB).

di confronto per i seguenti formati di memorizzazione: (CSV, CSV.gzip, Pickle, HDF5 [varie compressione]):

    read_s write_s size_ratio_to_CSV 
storage 
CSV    17.900 69.00    1.000 
CSV.gzip   18.900 186.00    0.047 
Pickle    0.173  1.77    0.374 
HDF_fixed   0.196  2.03    0.435 
HDF_tab   0.230  2.60    0.437 
HDF_tab_zlib_c5 0.845  5.44    0.035 
HDF_tab_zlib_c9 0.860  5.95    0.035 
HDF_tab_bzip2_c5 2.500 36.50    0.011 
HDF_tab_bzip2_c9 2.500 36.50    0.011 

lettura

enter image description here

scrittura/risparmio

enter image description here

rapporto dimensioni del file in relazione alla non compresso file CSV

enter image description here

dati grezzi:

CSV:

In [68]: %timeit df.to_csv(fcsv) 
1 loop, best of 3: 1min 9s per loop 

In [74]: %timeit pd.read_csv(fcsv) 
1 loop, best of 3: 17.9 s per loop 

CSV.gzip:

In [70]: %timeit df.to_csv(fcsv_gz, compression='gzip') 
1 loop, best of 3: 3min 6s per loop 

In [75]: %timeit pd.read_csv(fcsv_gz) 
1 loop, best of 3: 18.9 s per loop 

Pickle:

In [66]: %timeit df.to_pickle(fpckl) 
1 loop, best of 3: 1.77 s per loop 

In [72]: %timeit pd.read_pickle(fpckl) 
10 loops, best of 3: 173 ms per loop 

HDF (format='fixed') [Default]:

In [67]: %timeit df.to_hdf(fh5, 'df') 
1 loop, best of 3: 2.03 s per loop 

In [73]: %timeit pd.read_hdf(fh5, 'df') 
10 loops, best of 3: 196 ms per loop 

HDF (format='table'):

In [37]: %timeit df.to_hdf('D:\\temp\\.data\\37010212_tab.h5', 'df', format='t') 
1 loop, best of 3: 2.6 s per loop 

In [38]: %timeit pd.read_hdf('D:\\temp\\.data\\37010212_tab.h5', 'df') 
1 loop, best of 3: 230 ms per loop 

HDF (format='table', complib='zlib', complevel=5):

In [40]: %timeit df.to_hdf('D:\\temp\\.data\\37010212_tab_compress_zlib5.h5', 'df', format='t', complevel=5, complib='zlib') 
1 loop, best of 3: 5.44 s per loop 

In [41]: %timeit pd.read_hdf('D:\\temp\\.data\\37010212_tab_compress_zlib5.h5', 'df') 
1 loop, best of 3: 854 ms per loop 

HDF (format='table', complib='zlib', complevel=9):

In [36]: %timeit df.to_hdf('D:\\temp\\.data\\37010212_tab_compress_zlib9.h5', 'df', format='t', complevel=9, complib='zlib') 
1 loop, best of 3: 5.95 s per loop 

In [39]: %timeit pd.read_hdf('D:\\temp\\.data\\37010212_tab_compress_zlib9.h5', 'df') 
1 loop, best of 3: 860 ms per loop 

HDF (format='table', complib='bzip2', complevel=5):

In [42]: %timeit df.to_hdf('D:\\temp\\.data\\37010212_tab_compress_bzip2_l5.h5', 'df', format='t', complevel=5, complib='bzip2') 
1 loop, best of 3: 36.5 s per loop 

In [43]: %timeit pd.read_hdf('D:\\temp\\.data\\37010212_tab_compress_bzip2_l5.h5', 'df') 
1 loop, best of 3: 2.5 s per loop 

HDF (format='table', complib='bzip2', complevel=9):

In [42]: %timeit df.to_hdf('D:\\temp\\.data\\37010212_tab_compress_bzip2_l9.h5', 'df', format='t', complevel=9, complib='bzip2') 
1 loop, best of 3: 36.5 s per loop 

In [43]: %timeit pd.read_hdf('D:\\temp\\.data\\37010212_tab_compress_bzip2_l9.h5', 'df') 
1 loop, best of 3: 2.5 s per loop 

PS non posso testare 012.332.423,946 milasul mio notebook di Windows

DF informazioni:

In [49]: df.shape 
Out[49]: (4000000, 6) 

In [50]: df.info() 
<class 'pandas.core.frame.DataFrame'> 
RangeIndex: 4000000 entries, 0 to 3999999 
Data columns (total 6 columns): 
a datetime64[ns] 
b datetime64[ns] 
c datetime64[ns] 
d datetime64[ns] 
e datetime64[ns] 
f datetime64[ns] 
dtypes: datetime64[ns](6) 
memory usage: 183.1 MB 

In [41]: df.head() 
Out[41]: 
        a     b     c \ 
0 1970-01-01 00:00:00 1970-01-01 00:01:00 1970-01-01 00:02:00 
1 1970-01-01 00:01:00 1970-01-01 00:02:00 1970-01-01 00:03:00 
2 1970-01-01 00:02:00 1970-01-01 00:03:00 1970-01-01 00:04:00 
3 1970-01-01 00:03:00 1970-01-01 00:04:00 1970-01-01 00:05:00 
4 1970-01-01 00:04:00 1970-01-01 00:05:00 1970-01-01 00:06:00 

        d     e     f 
0 1970-01-01 00:03:00 1970-01-01 00:04:00 1970-01-01 00:05:00 
1 1970-01-01 00:04:00 1970-01-01 00:05:00 1970-01-01 00:06:00 
2 1970-01-01 00:05:00 1970-01-01 00:06:00 1970-01-01 00:07:00 
3 1970-01-01 00:06:00 1970-01-01 00:07:00 1970-01-01 00:08:00 
4 1970-01-01 00:07:00 1970-01-01 00:08:00 1970-01-01 00:09:00 

Le dimensioni dei file:

{ .data } » ls -lh 37010212.*                   /d/temp/.data 
-rw-r--r-- 1 Max None 492M May 3 22:21 37010212.csv 
-rw-r--r-- 1 Max None 23M May 3 22:19 37010212.csv.gz 
-rw-r--r-- 1 Max None 214M May 3 22:02 37010212.h5 
-rw-r--r-- 1 Max None 184M May 3 22:02 37010212.pickle 
-rw-r--r-- 1 Max None 215M May 4 10:39 37010212_tab.h5 
-rw-r--r-- 1 Max None 5.4M May 4 10:46 37010212_tab_compress_bzip2_l5.h5 
-rw-r--r-- 1 Max None 5.4M May 4 10:51 37010212_tab_compress_bzip2_l9.h5 
-rw-r--r-- 1 Max None 17M May 4 10:42 37010212_tab_compress_zlib5.h5 
-rw-r--r-- 1 Max None 17M May 4 10:36 37010212_tab_compress_zlib9.h5 

Conclusione:

Pickle e HDF5 sono molto più veloce, ma HDF5 è più conveniente - tu c un negozio di tabelle multiple/cornici interne, è possibile leggere i dati in modo condizionale (guardare where parametro nel read_hdf()), è anche possibile memorizzare i dati compressi (zlib - è più veloce, bzip2 - fornisce una migliore rapporto di compressione), ecc

PS se si può costruire/utilizzare feather-format - dovrebbe essere ancora più veloce rispetto al HDF5 e Pickle

PPS: non utilizzare Pickle per i grandi frame di dati, come si può finire con SystemError: error return without exception set messaggio di errore. È anche descritto come here e here.

+3

Si potrebbe voler provare 'cPickle.dump (..., protocol = 2)' come in http://matthewrocklin.com/blog/work/2015/03/ 16/Serializzazione veloce Nei miei test era 3 volte più veloce del formato fisso HDF. –

Problemi correlati