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!
我能想到的唯一問題是Process的__init__方法在主線程中執行。也許把hdf5文件的開頭移到run方法的開頭? – Trilarion