2017-09-01 37 views
3

我正在使用當前運行大型(> 5GB).csv文件的系統。爲了提高性能,我正在測試(A)從磁盤創建數據幀的不同方法(pandas VS dask)以及(B)將結果存儲到磁盤(.csv VS hdf5文件)的不同方法。從CSV導入與HDF5相比,爲什麼熊貓和dask表現更好?

爲基準性能,我做了以下內容:

def dask_read_from_hdf(): 
    results_dd_hdf = dd.read_hdf('store.h5', key='period1', columns = ['Security']) 
    analyzed_stocks_dd_hdf = results_dd_hdf.Security.unique() 
    hdf.close() 

def pandas_read_from_hdf(): 
    results_pd_hdf = pd.read_hdf('store.h5', key='period1', columns = ['Security']) 
    analyzed_stocks_pd_hdf = results_pd_hdf.Security.unique() 
    hdf.close() 

def dask_read_from_csv(): 
    results_dd_csv = dd.read_csv(results_path, sep = ",", usecols = [0], header = 1, names = ["Security"]) 
    analyzed_stocks_dd_csv = results_dd_csv.Security.unique() 

def pandas_read_from_csv(): 
    results_pd_csv = pd.read_csv(results_path, sep = ",", usecols = [0], header = 1, names = ["Security"]) 
    analyzed_stocks_pd_csv = results_pd_csv.Security.unique() 

print "dask hdf performance" 
%timeit dask_read_from_hdf() 
gc.collect() 
print"" 
print "pandas hdf performance" 
%timeit pandas_read_from_hdf() 
gc.collect() 
print"" 
print "dask csv performance" 
%timeit dask_read_from_csv() 
gc.collect() 
print"" 
print "pandas csv performance" 
%timeit pandas_read_from_csv() 
gc.collect() 

我的研究結果是:

dask hdf performance 
10 loops, best of 3: 133 ms per loop 

pandas hdf performance 
1 loop, best of 3: 1.42 s per loop 

dask csv performance 
1 loop, best of 3: 7.88 ms per loop 

pandas csv performance 
1 loop, best of 3: 827 ms per loop 

當HDF5存儲可以快速比的.csv當DASK創建dataframes更快的訪問,爲什麼dask從hdf5慢於csv的d​​ask?難道我做錯了什麼?

什麼時候從HDF5存儲對象創建dask數據幀對性能有意義?

回答

5

HDF5處理數字數據時效率最高,我猜你正在閱讀單個字符串列,這是它的弱點。

與HDF5字符串數據的性能可以通過使用Categorical來存儲你的字符串,假設相對低基數(大量重複值)

這是從一個小而回得到顯着改善,但一個好的博客文章這裏經歷了這些考慮。 http://matthewrocklin.com/blog/work/2015/03/16/Fast-Serialization

您也可以看看使用parquet--它與HDF5類似,因爲它是一種二進制格式,但是面向列,所以像這樣的單列選擇可能會更快。

近期(2016- 2017年)已經實現parquet->大熊貓的快速本地讀者,以及熊貓(0.21)的下一個主要版本將內置有to_parquetpd.read_parquet功能顯著的工作。

https://arrow.apache.org/docs/python/parquet.html

https://fastparquet.readthedocs.io/en/latest/

https://matthewrocklin.com/blog//work/2017/06/28/use-parquet

+1

使用木地板的一大+1 – MRocklin