我在几个线程中使用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'
我真的不知道为什么会发生这种情况:/,我可以访问dtype
和shape
,但是在访问任何切片时我都会收到此错误。
修改
调用
process(0, len(dataset), dataset)
主线程中的按预期工作。
答案 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)来解决的。