我要创建一个巨大的(> 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 。因此,它应该以某种方式将数组保存为全零,然后使用计算值更新此保存的矩阵。 快做这件事的正确方法是什么?
感谢您的帮助!
答案 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()