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