Python 3.x h5py,零星的书写错误

Python 3.x h5py,零星的书写错误,python-3.x,filesystems,hdf5,h5py,Python 3.x,Filesystems,Hdf5,H5py,我有一些浮点数要存储在一个大的(500K x 500K)矩阵中。我使用可变大小的数组(根据某些特定条件)将它们存储在块中 我有一个并行代码(Python3.3和h5py),它生成数组并将它们放在共享队列中,还有一个专用进程从队列中弹出并将它们逐个写入HDF5矩阵。它在大约90%的时间内都能正常工作 有时,我会遇到特定数组的写入错误。如果我多次运行它,故障阵列会一直发生变化 代码如下: def writer(in_q): # Open HDF5 archive hdf5_file

我有一些浮点数要存储在一个大的(500K x 500K)矩阵中。我使用可变大小的数组(根据某些特定条件)将它们存储在块中

我有一个并行代码(Python3.3和h5py),它生成数组并将它们放在共享队列中,还有一个专用进程从队列中弹出并将它们逐个写入HDF5矩阵。它在大约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()
如果我在写作任务中插入两秒钟的暂停时间(time.sleep(2)),那么问题似乎就解决了(尽管每次写作我不能浪费2秒钟,因为我需要写超过250000次)。如果捕获写入异常并将错误数组放入队列中,脚本将永远不会停止(大概是这样)

我使用的是CentOS(2.6.32-279.11.1.el6.x86_64)。有什么见解吗


非常感谢。

当将多处理模块与HDF5一起使用时,唯一的大限制是调用fork()时不能打开任何文件(甚至是只读文件)。换句话说,如果在主进程中打开一个文件进行写入,然后Python派生出一个子进程进行计算,那么可能会出现问题。它与fork()的工作方式以及HDF5本身对如何处理文件描述符的选择有关


我的建议是,在打开主文件进行写入之前,请仔细检查您的应用程序,以确保您正在创建任何池等。

谢谢您的建议。我用Python代码更新了我的请求,你能看一下吗?嗯。。。我假设生产商和消费者流程没有以任何方式接触HDF5?是的,这是正确的。我注意到,如果我恢复以前版本的hdf5存档(在过去的实验中没有使用),一切都很好。这似乎与操作系统有关。可能是吗?
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)