2016-04-23 33 views
3

我正在使用h5py通過python迭代寫入大型數組。這需要相當長的時間,我可以在代碼運行時觀察文件的大小。寫入過程完成後HDF5文件內容消失

不幸的是,我的python程序退出,文件內容消失。該文件沒有損壞,但所有值都是0.0(我設置的填充值)。 我確定文件f已關閉f.close(),並關閉文件後(但在退出程序之前),文件仍然完好無損,內容在那裏。

是否有人熟悉這種行爲,並可以解釋發生了什麼?我會很感激任何幫助!

爲了給你更多的信息,這裏是我特別做的。我創建了一個Process,處理來自Queue的結果。當進程初始化時,將創建HDF5文件,並在到達隊列中的最後一項時關閉該文件。所有這些似乎工作正常(如上所述),但我提到它,因爲我沒有很多有關進程的經驗,並想知道流程類中的文件處理是否可能是問題。

from multiprocessing import Process, Queue 
import h5py 

class ResultProcessor(Process): 

    def __init__(self, result_queue, result_file): 
     Process.__init__(self) 
     self.result_queue = result_queue 
     self.daemon = True 

     #open result file handle ('w') 
     self.f = h5py.File(result_file, 'w') 
     self.dset = self.f.create_dataset('zipped', (num_jobs, num_subjects), compression="gzip", fillvalue=0) 

    def run(self): 
     while True: 
      next_result = self.result_queue.get() 

      if next_result is None: 
       # Poison pill means we should exit 
       self.f.close() 
       return 

      idx, result = next_result 
      self.dset[idx,:] = result 

的過程,然後初始化,如下運行:

# results_queue is still empty 
result_processor = ResultProcessor(results_queue, file_name) 
result_processor.start() 

# now the result queue is filled 
process_stuff_and_feed_to_result_queue() 
# add last queue item so the end can be recognised: 
result_queue.put(None) 

result_processor.join() 

# I checked at this point: The file content is still around! 
+0

我能想到的唯一問題是Process的__init__方法在主線程中執行。也許把hdf5文件的開頭移到run方法的開頭? – Trilarion

回答

0

雖然這不會解決,爲什麼文件的內容似乎消失了,你應該記住,HDF5(因此h5py)沒有被設計爲寫有多個程序(使用多處理通常屬於這種情況)寫入同一個文件。在1.10中有MPI支持和SWMR(單作者多讀者),但是你沒有完全的自由來以任何順序寫任何東西。