使用多处理调度程序

时间:2017-03-01 05:45:13

标签: hdf5 h5py dask

Dask是一个记录良好的可扩展库,用于并行处理,使用基于图形的工作流在编写许多具有与之相关的固有并行性的应用程序时非常有用。然而,当并行写入hdf5文件时,特别是在使用多处理调度程序时,这是相当困难的。如果使用默认的多线程调度程序,以下代码可以正常工作

x = da.arange(25000, chunks = (1000,))
da.to_hdf5('hdfstore.h5', '/store', x)

但是如果你全局设置多处理调度程序:

dask.set_options(get=dask.multiprocessing.get)

再次运行代码,

TypeError: can't pickle _thread.lock objects

多线程调度程序没问题,但是从单个大型csv文件读取并将其转换为hdf5文件时速度太慢。使用多处理调度程序,它的速度快,能够在最大负载下使用所有CPU,但hdf写入失败并带有上述错误(hdf5文件支持使用h5py mpi驱动程序同时写入访问,我认为)。如果你直接做

x.compute()

一切都很好但是它将整个数据加载到内存中,这对大型数组和文件来说并不是很好。有人遇到过这种情况吗?请分享宝贵的建议..

conda虚拟环境上的Dask版本'0.13.0'

1 个答案:

答案 0 :(得分:0)

我认为这段代码的问题在于,当您使用多处理调度程序时,它会同时将不同的数据块写入同一个hdf5文件。

据我所知,HDF5格式支持HDF5 SWMR。因此,当1个Python进程有权编写1个块时,它会通过锁定机制阻止其他进程同时写入。

如果你想要同时写,也许this可以帮助。