Сохранение `dask.array` в виде набора данных hdf5 - PullRequest
0 голосов
/ 08 мая 2018

У меня есть dask.array, охватывающий несколько файлов hdf5. По сути, я хотел бы нарезать набор данных и сохранить полученный срез в hdf5. То, что я пробовал до сих пор, в основном это:

In [1]: import dask.array as da

In [3]: import numpy as np

In [5]: xs = da.from_array(np.linspace(0, 10), chunks=10) # could be from hdf5 files

In [7]: import h5py

In [8]: h5f = h5py.File('/tmp/paul/foo.h5')

In [9]: h5f.create_dataset(name='ham', data=xs)
Out[9]: <HDF5 dataset "ham": shape (50,), type "<f8">

Это прекрасно работает. Однако, когда я da.concatenate несколько h5py наборов данных, функция create_dataset, кажется, зависает (тупик потока?). Обратите внимание, что xs может представлять собой набор данных (приблизительный) 10 ГБ, охватывающий 10 файлов по 1 ГБ каждый.

Какой разумный способ записать xs в набор данных h5py, не прибегая к da.compute и рискуя MemoryError?

1 Ответ

0 голосов
/ 08 мая 2018

Я подозреваю, что библиотека h5py преобразует ваш массив dask в массивный массив в памяти, что, вероятно, не то, что вам нужно.

Вместо этого вам, вероятно, понадобится функция сохранения (см. этот раздел в документации )

f = h5py.File('myfile.hdf5')
d = f.require_dataset('/data', shape=x.shape, dtype=x.dtype)
da.store(x, d)

Возможно, вам также понадобится метод to_hdf5 (см. этот раздел в документации )

da.to_hdf5('myfile.hdf5', '/x', x)

Вы должны позаботиться о правильном разбиении набора данных HDF5 так, чтобы он совпал с вашим разбиением массива dask.array. to_hdf5 метод справится с этим для вас, если вы предпочитаете не думать об этом самостоятельно.

...