2015-05-16 48 views
1

我使用h5py處理多個線程的數組:不能從一個線程訪問HDF5陣列

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) 

在主線程中按預期工作。

回答

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不提供線程級併發。雖然上面的例子「有效」(前提:用「threadsafe」選項編譯hdf5),但這兩個操作將按順序運行。 Hdf5操作是阻塞的,並且在I/O期間不釋放全局解釋器鎖,這會阻止線程並行運行。

如果你想讓你的代碼並行執行,你必須使用進程而不是線程。但是請注意,平行讀數只有使用MP5版本的h5py/hdf5纔是安全的。

+0

我正在使用一個大數據集,計算數據集中每幀圖像配準的相位相關性。這需要一些計算時間。因此I/O操作可以是順序的。我只需要處理內存中的一些分塊部分。 上述代碼在我的設置中不起作用,奇怪的是,我可以使用函數'read_direct'並且一切正常。寫入數據集也可以在線程中完成(Ofc將所有內容鎖定爲順序)。所以我猜''read_direct'和'__get_item__'之間有一些不同的行爲? – user1447257

+0

全局解釋器鎖只在I/O上?讀/寫之後,釋放鎖並且線程再次並行運行? – user1447257

+0

你可能想從h5py的主要作者購買這本書: http://shop.oreilly.com/product/0636920030249.do – weatherfrog

0

我有同樣的問題。 它通過更新h5py(從2.2到2.6)解決。

+0

僅供參考,我最近遇到了2.7.0的相同問題,並通過*降級*到2.6.0來修復它。 –