无法从线程访问hdf5数组

时间:2015-05-16 15:56:45

标签: multithreading h5py

我在几个线程中使用h5py处理数组:

def process(start, end, dataset):
    for i in xrange(start, end):
        # Do something with dataset[i]

f = h5py.File(path, 'r')
dataset = f[...]

worker = [threading.Thread(target=process, args=(start, end, dataset)) \
          for start, end in ...]

从线程

访问数组时出错
  File "/usr/lib/python2.7/dist-packages/h5py/_hl/dataset.py", line 367, in __getitem__
    if self._local.astype is not None:
AttributeError: 'thread._local' object has no attribute 'astype'

我真的不知道为什么会发生这种情况:/,我可以访问dtypeshape,但是在访问任何切片时我都会收到此错误。

修改

调用

process(0, len(dataset), dataset)
主线程中的

按预期工作。

2 个答案:

答案 0 :(得分:0)

您能提供一个重现错误的完整示例吗?还请提及您正在使用的Python,h5py和hdf5库的版本,以及您的操作系统。

以下代码适用于我的设置,它适用于您的设置吗?

import threading
import h5py
import numpy as np

db = h5py.File('/tmp/test.h5', 'w')
dataset = db.create_dataset("mydata", data=np.random.random((10,)))

def process(start, end, dataset):
    for i in xrange(start, end):
        print(dataset[i])

workers = [threading.Thread(target=process, args=(start, end, dataset))
           for start, end in [[1,2], [3,4]]]
workers[0].start()
workers[1].start()
db.close()

请问您为什么使用线程来处理hdf5文件?请注意,hdf5不提供线程级并发。虽然上面的例子"工作" (前提:hdf5使用" threadsafe"选项编译),这两个操作将按顺序运行。 Hdf5操作是阻塞的,并且在I / O期间不释放全局解释器锁,这会阻止线程并行运行。

如果希望代码并行执行,则必须使用进程而不是线程。但请注意,并行读取只能使用MPI版本的h5py / hdf5进行安全。

答案 1 :(得分:0)

我遇到了同样的问题。 它是通过更新h5py(从2.2到2.6)来解决的。