我有一些浮点数要存储在一个大的(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()下面是错误:
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)),那么问题似乎就解决了(尽管我不能在每次写入中浪费2秒,因为我需要写入超过250.000次)。如果我捕获写入异常并将有问题的数组放入队列中,脚本将永远不会停止(可能)。
我正在使用CentOS (2.6.32-279.11.1.el6.x86_64)。有什么见解吗?
非常感谢。
发布于 2013-12-13 07:38:29
在使用带有HDF5的多处理模块时,唯一的限制是在调用fork()时不能打开任何文件(即使是只读的)。换句话说,如果您在主进程中打开一个文件进行写入,然后Python剥离一个子进程进行计算,则可能会出现问题。它与fork()的工作方式以及HDF5本身对如何处理文件描述符的选择有关。
我的建议是,在打开要写入的主文件之前,仔细检查您的应用程序,以确保您正在创建任何池等。
https://stackoverflow.com/questions/20551899
复制相似问题