Dask-创建空数组以填充并保存它

时间:2019-06-12 08:07:45

标签: python dask

我要创建一个巨大的(> 100GB)大型数组,然后用我计算出的值填充它。然后,我想将其另存为hdf5文件。我选择了这是我的代码:

import dask.array as da

size = 100000
chunks = 50000
file_path = "..."

# calculate entries
A = da.zeros(shape=(size, size), chunks=(chunks, chunks))
for i in range(size):
    for j in range(size):
        A[i,j] = compute_value(i,j)

# store in FS
f = h5py.File(file_path)
dset = f.create_dataset('/data', shape=A.shape, chunks=(chunks, chunks), dtype='f8')
da.store(A, dset)

我在分配A [i,j]时遇到错误:

NotImplementedError: Item assignment with <class 'tuple'> not supported

请注意,该数组太大,无法放入RAM 。因此,它应该以某种方式将数组保存为全零,然后使用计算值更新此保存的矩阵。 快做这件事的正确方法是什么?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

它首先以hdf5格式保存矩阵,然后更改值。这是代码:

size = 100000
chunks = 5000
file_path = "..."

A = da.zeros(shape=(size, size), chunks=(chunks, chunks))
with h5py.File(file_path, 'w') as f:
    dset = f.create_dataset('/data', shape=A.shape, chunks=(chunks, chunks), dtype='f8')
    da.store(A, dset)
    for i in range(size):
        for j in range(size):
            dset[i,j] = random.randint(0,101)

这可以稍后加载和使用,例如如下:

with h5py.File(file_path, 'r') as f:
    A = da.from_array(f["/data"], chunks=(chunks, chunks))
    x = da.linalg.solve(A, b)
    res = x.compute()