3

joblib/multiprocessing でコマンドを並行して実行しようとすると、エラーが発生します。

ここにトレースバックがあります:

Process PoolWorker-263:
Traceback (most recent call last):
File "/home/marcel/anaconda/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
            self.run()
          File "/home/marcel/anaconda/lib/python2.7/multiprocessing/process.py", line 114, in run
            self._target(*self._args, **self._kwargs)
          File "/home/marcel/anaconda/lib/python2.7/multiprocessing/pool.py", line 102, in worker
            task = get()
          File "/home/marcel/.local/lib/python2.7/site-packages/joblib/pool.py", line 363, in get
          File "_objects.pyx", line 240, in h5py._objects.ObjectID.__cinit__ (h5py/_objects.c:2994)
        TypeError: __cinit__() takes exactly 1 positional argument (0 given)

エラー メッセージからわかるように、h5py を使用して読み込まれたデータを操作します。事態をさらに複雑にするために、並列化したいルーチンはそのサブルーチンの 1 つで numba を使用していますが、それが問題にならないことを願っています。

コピーして貼り付けることができる実行例を次に示します。

from joblib import Parallel,delayed
import numpy as np
import h5py as h5
import os

def testfunc(h5data, row):
    # some very boneheaded CPU work
    data_slice = h5data[:,row,...]
    ma = np.mean(data_slice, axis = 1)
    x = row
    return ma, x

def run():
    data = np.random.random((100,100,100)) 
    print data
    f_out = h5.File('tmp.h5', 'w')
    dset = f_out.create_dataset('mydata', data = data )
    f_out.close()
    f_in = h5.File('tmp.h5', 'r')
    h5data = f_in['mydata']
    pool = Parallel(n_jobs=-1,verbose=1,pre_dispatch='all')
    results = pool(delayed(testfunc)(h5data, i) for i in range(h5data.shape[1]))
    f_in.close()
    os.remove('tmp.h5')


if __name__ == '__main__':
    run()

私が間違っていることは何ですか?

編集: 少なくとも、悪者のリストから numba を除外できます...

4

1 に答える 1

0

1「joblib with [pathos][1] which replacespickle withdill」の置き換えを試みることができます。これにより、通常、すべての酸洗いの問題が解決されます。

于 2017-07-31T12:09:23.387 に答える