Dask - создать пустой массив для заполнения и сохранить его - PullRequest
0 голосов
/ 12 июня 2019

Я хочу создать огромный (> 100 ГБ) массив dask , а затем заполнить его значениями , которые я вычисляю. Затем я хочу сохранить его как файл 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 Ответ

1 голос
/ 12 июня 2019

Сработало сохранение сначала матрицы в формате 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()
...