Ошибка памяти при загрузке очень больших данных из файла h5 в кластер - PullRequest
0 голосов
/ 11 марта 2020

Я сталкиваюсь с ошибкой MemoryError при попытке загрузить очень большой набор данных из файла hdf5. Ниже я привел короткий пример.

import dask
import dask.array as da
import h5py

from dask.distributed import Client
client = Client('tcp://10.11.69.71:44393')

handle = h5py.File('h5_file.h5', 'r')  # matrix size: (4500, 6291456)
a = da.from_array(handle['_data'], chunks='auto')  # matrix size: (6291456, 128)
st1 = da.random.random((a.shape[1], 128))

st = client.run(start)
res = da.matmul(a, st1)    
res.compute()

Это приводит к следующей ошибке:

distributed.worker - WARNING -  Compute Failed
Function:  execute_task
args:      ((subgraph_callable, (<function concatenate_axes at 0x2b85d304a0d0>, [array([[ 42.,  50.,   5., ..., 168., 203., 214.],
       [129., 159.,   0., ..., 187., 153., 136.],
       [  0.,   0.,   0., ..., 228., 209., 204.],
       ...,
       [ 18.,  28.,  13., ..., 255., 227., 218.],
       [ 79.,  86.,  61., ...,  53.,  64.,  55.],
       [ 42.,  76., 106., ..., 101.,  35.,  20.]], dtype=float32), array([[ 50.,  60.,  33., ..., 169., 204., 215.],
       [ 24., 111.,   0., ..., 185., 151., 133.],
       [  0.,   0.,   0., ..., 226., 207., 202.],
       ...,
       [ 17.,  23.,  14., ..., 255., 228., 219.],
       [111., 120., 101., ...,  53.,  64.,  55.],
       [ 85.,  98.,  90., ..., 100.,  37.,  22.]], dtype=float32), array([[ 65.,  61.,  35., ..., 170., 205., 215.],
       [215., 237., 214., ..., 184., 149., 131.],
       [ 49.,  42.,  21., ..., 223., 205., 200.],
       ...,
       [ 16.,  20.,  11., ..., 255., 229., 220.],
       [ 85.,  85.,  69., ...,  53.,  64.,  54.],
       [ 6
kwargs:    {}
Exception: MemoryError()

Я загружаю данные неправильно? Я попытался использовать результат, но безрезультатно.

PS Я использую dask-mpi для создания моего клиента

1 Ответ

0 голосов
/ 13 марта 2020

Обратите внимание, что, вызывая .compute, вы запрашиваете, чтобы вывод ваших вычислений был возвращен вам в виде единого массива numpy в памяти.

Если ваш вывод очень большой, вы можете вместо этого сохранить его в файл, используя функцию типа to_hdf5.

...