我正在使用h5py
迭代地使用python写入一个大型数组。这需要相当长的时间,我可以看到文件大小随着代码的运行而增长。
不幸的是,当我的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 :(得分:0)
虽然这不能解决为什么文件内容似乎消失的原因,但你应该记住,HDF5(以及因此h5py)不是为了编写多个程序而设计的(使用多处理通常属于这个)写入同一个文件。在1.10中有MPI支持和SWMR(单个编写器多个读取器),但是您没有完全自由地以任何顺序编写任何内容。