从库中获得一个读取文件并返回numpy数组的函数。
我想用多个文件中的多个块构建一个Dask数组。
每个块都是在文件上调用函数的结果。
当我要求Dask计算时,Dask会要求功能同时从硬盘读取多个文件吗?
如果是这种情况,如何避免这种情况?我的计算机没有并行文件系统。
示例:
import numpy as np
import dask.array as da
import dask
# Make test data
n = 2
m = 3
x = np.arange(n * m, dtype=np.int).reshape(n, m)
np.save('0.npy', x)
np.save('1.npy', x)
# np.load is a function that reads a file
# and returns a numpy array.
# Build delayed
y = [dask.delayed(np.load)('%d.npy' % i)
for i in range(2)]
# Build individual Dask arrays.
# I can get the shape of each numpy array without
# reading the whole file.
z = [da.from_delayed(a, (n, m), np.int) for a in y]
# Combine the dask arrays
w = da.vstack(z)
print(w.compute())
答案 0 :(得分:1)
您可以使用分布式 lock原语-这样,您的加载程序函数便会获取读取释放。
User
此外,read_lock = distributed.Lock('numpy-read')
@dask.delayed
def load_numpy(lock, fn):
lock.acquire()
out = np.load(fn)
lock.release()
return out
y = [load_numpy(lock, '%d.npy' % i) for i in range(2)]
接受一个锁,因此您可以通过延迟函数da.from_array
直接提供锁来创建单个数组。
或者,您可以分配一个单位 resource发给工作人员(具有多个线程),然后按照链接文档中的示例,每个文件读取任务需要一个单位的时间进行计算(或持久化)。
回复评论:问题中未指定np.load
,我不确定为什么现在要对其进行质疑。但是,您可以将to_hdf
与da.store(compute=False)
一起使用,然后指定在调用compute时要使用的资源。请注意,这不会将数据具体化到内存中。