与HDF5相比,为什么从CSV导入时pandas和dask的性能更好?

sud*_*nym 3 python hdf5 dask

我正在使用当前使用大(> 5GB).csv文件操作的系统.为了提高性能,我正在测试(A)从磁盘创建数据帧的不同方法(pandas VS dask)以及(B)将结果存储到磁盘的不同方法(.csv VS hdf5文件).

为了衡量绩效,我做了以下几点:

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()
Run Code Online (Sandbox Code Playgroud)

我的发现是:

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
Run Code Online (Sandbox Code Playgroud)

当hdf5存储的访问速度比.csv快时,并且当dask创建数据帧的速度比pandas快时,为什么hdf5的dask比csv的d​​ask慢?难道我做错了什么?

何时从HDF5存储对象创建dask数据帧的性能是否有意义?

chr*_*isb 10

HDF5在处理数值数据时效率最高,我猜你正在读一个字符串列,这是它的弱点.

Categorical假设相对较低的基数(大量重复值),使用存储字符串可以显着提高使用HDF5的字符串数据的性能

这是从一段时间后回来的,但是这里有一篇好的博客文章正是经历了这些考虑. http://matthewrocklin.com/blog/work/2015/03/16/Fast-Serialization

你也可以看看使用镶木地板 - 它类似于HDF5,因为它是二进制格式,但是面向列,所以像这样的单列选择可能会更快.

最近(2016-2017)已经有很多工作要实现一个快速的原木阅读器 - > pandas,pandas(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 (2认同)