0

大きな (500K x 500K) マトリックスに格納するいくつかの浮動小数点数があります。(いくつかの特定の条件に従って) 可変サイズの配列を使用して、それらをチャンクに格納しています。

配列を生成して共有キューに入れる並列化されたコード (Python3.3 および h5py) と、キューからポップして HDF5 マトリックスに 1 つずつ書き込む 1 つの専用プロセスがあります。約 90% の確率で期待どおりに動作します。

ときどき、特定の配列で書き込みエラーが発生しました。複数回実行すると、障害のあるアレイが常に変化します。

コードは次のとおりです。

def writer(in_q):
    # Open HDF5 archive
    hdf5_file = h5py.File("./google_matrix_test.hdf5")
    hdf5_scores = hdf5_file['scores']
    while True:
        # Get some data
        try:
            data = in_q.get(timeout=5)
        except:
            hdf5_file.flush()
            print('HDF5 archive updated.')
            break
        # Process the data
        try:
            hdf5_scores[data[0], data[1]:data[2]+1] = numpy.matrix(data[3:])
        except:
            # Print faulty chunk's info
            print('E: ' + str(data[0:3]))
            in_q.put(data)  # <- doesn't solve
        in_q.task_done()

def compute():
    jobs_queue = JoinableQueue()
    scores_queue = JoinableQueue()

    processes = []
    processes.append(Process(target=producer, args=(jobs_queue, data,)))
    processes.append(Process(target=writer, args=(scores_queue,)))
    for i in range(10):
        processes.append(Process(target=consumer, args=(jobs_queue,scores_queue,)))

    for p in processes:
        p.start()

    processes[1].join()
    scores_queue.join()

エラーは次のとおりです。

Process Process-2:
Traceback (most recent call last):
    File "/local/software/python3.3/lib/python3.3/multiprocessing/process.py", line 258, in _bootstrap
        self.run()
    File "/local/software/python3.3/lib/python3.3/multiprocessing/process.py", line 95, in run
        self._target(*self._args, **self._kwargs)
    File "./compute_scores_multiprocess.py", line 104, in writer
        hdf5_scores[data[0], data[1]:data[2]+1] = numpy.matrix(data[3:])
    File "/local/software/python3.3/lib/python3.3/site-packages/h5py/_hl/dataset.py", line 551, in __setitem__
        self.id.write(mspace, fspace, val, mtype)
    File "h5d.pyx", line 217, in h5py.h5d.DatasetID.write (h5py/h5d.c:2925)
    File "_proxy.pyx", line 120, in h5py._proxy.dset_rw (h5py/_proxy.c:1491)
    File "_proxy.pyx", line 93, in h5py._proxy.H5PY_H5Dwrite (h5py/_proxy.c:1301)
OSError: can't write data (Dataset: Write failed)

書き込みタスクの間に 2 秒の一時停止 (time.sleep(2)) を挿入すると、問題は解決したように見えます (ただし、250.000 回以上書き込む必要があるため、書き込みごとに 2 秒を無駄にすることはできません)。書き込み例外をキャプチャして障害のある配列をキューに入れると、スクリプトは停止しません (おそらく)。

CentOS (2.6.32-279.11.1.el6.x86_64) を使用しています。洞察はありますか?

どうもありがとう。

4

1 に答える 1