避免同时读取多个数组的文件

时间:2018-08-05 17:30:22

标签: python dask

从库中获得一个读取文件并返回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())

1 个答案:

答案 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_hdfda.store(compute=False)一起使用,然后指定在调用compute时要使用的资源。请注意,这不会将数据具体化到内存中。