Почему нет параллельного присвоения набора данных h5py? - PullRequest
1 голос
/ 19 июня 2019

Я пытаюсь сгенерировать набор данных hdf5 из кода, который выполняется параллельно, но когда я читаю сгенерированный набор данных, он пуст, все записи равны нулю.

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

Вот код минимального примера

import h5py
import scipy.stats as st

file = h5py.File('test.hdf5','a')

dset = file.create_dataset('x', (10,1024), maxshape=(None,1024), 
                           dtype='float32')

def assign(j):
    dset[j,:] = st.norm.rvs(0.,1.,1024)

from joblib import Parallel, delayed
import multiprocessing as mp

Parallel(n_jobs=4)(delayed(assign)(j) for j in range(10))

file.close()

И файл позже читается с

import h5py

file = h5py.File('test.hdf5','r')
file['x'][:]

В чем проблема с кодом, работающим параллельно?

1 Ответ

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

Каждый поток вашего параллельного кода получает свою собственную копию dset, и они продолжают наступать друг другу на ноги. Вы можете попробовать что-то вроде этого, чтобы заставить его работать:

def get_row(x) :
    return st.norm.rvs(0.,1.,1024)

dset[:,:] = Parallel(n_jobs=4)(delayed(get_row)(j) for j in range(10))

пс. спасибо @gapollo за исправление!

...