使用dask分布式时,我需要将dask数组保存到hdf5。我的情况与本期中描述的情况非常相似:https://github.com/dask/dask/issues/3351。基本上,这段代码可以工作:
import dask.array as da
from distributed import Client
import h5py
from dask.utils import SerializableLock
def create_and_store_dask_array():
data = da.random.normal(10, 0.1, size=(1000, 1000), chunks=(100, 100))
data.to_hdf5('test.h5', '/test')
# this fails too
# f = h5py.File('test.h5', 'w')
# dset = f.create_dataset('/matrix', shape=data.shape)
# da.store(data, dset) #
# f.close()
create_and_store_dask_array()
但是,一旦我尝试使用分布式调度程序,我就会收到TypeError:无法腌制_thread._local对象。
import dask.array as da
from distributed import Client
import h5py
from dask.utils import SerializableLock
from dask.distributed import Client, LocalCluster,progress,performance_report
def create_and_store_dask_array():
data = da.random.normal(10, 0.1, size=(1000, 1000), chunks=(100, 100))
data.to_hdf5('test.h5', '/test')
# this fails too
# f = h5py.File('test.h5', 'w')
# dset = f.create_dataset('/matrix', shape=data.shape)
# da.store(data, dset) #
# f.close()
cluster = LocalCluster(n_workers=35,threads_per_worker=1)
client =Client(cluster)
create_and_store_dask_array()
我目前正在通过将我的计算分小部分提交给调度程序,将结果收集到内存中并使用h5py保存数组来解决此问题,但这非常非常慢。有人可以建议解决此问题的方法吗?问题讨论意味着xarray可以采用dask数组并将其写入hdf5文件,尽管这似乎很慢。
import xarray as xr
import netCDF4
import dask.array as da
from distributed import Client
import h5py
from dask.utils import SerializableLock
cluster = LocalCluster(n_workers=35,threads_per_worker=1)
client =Client(cluster)
data = da.random.normal(10, 0.1, size=(1000, 1000), chunks=(100, 100))
#data.to_hdf5('test.h5', '/test')
test = xr.DataArray(data,dims=None,coords=None)
#save as hdf5
test.to_netcdf("test.h5",mode='w',format="NETCDF4")
如果有人可以提出解决方案,我很想找到一种解决方案(尤其是不涉及添加其他依赖项的解决方案)
预先感谢
答案 0 :(得分:1)
H5Py对象不可序列化,因此很难在分布式上下文中的不同进程之间移动。显式to_hdf5
方法可解决此问题。更为通用的store
方法不会以相同的方式对HDF5进行特殊处理。