Python HDF5文件内容在写入过程完成后消失

Python HDF5文件内容在写入过程完成后消失,python,io,h5py,Python,Io,H5py,我使用h5py使用python迭代地写入一个大数组。这需要相当长的时间,我可以看到文件大小随着代码的运行而增长 不幸的是,当我的python程序退出时,文件内容消失了。文件未损坏,但所有值均为0.0(我设置的填充值)。 我确保文件f已使用f.close()关闭,并且在关闭文件后(但在退出程序之前),文件仍然完好无损,内容仍然存在 有人熟悉这种行为并能解释那里发生了什么吗?我将感谢任何帮助 为了给你更多的信息,这里是我具体做的。我创建了一个进程,该进程处理队列的结果。初始化流程时,将创建HDF5文

我使用
h5py
使用python迭代地写入一个大数组。这需要相当长的时间,我可以看到文件大小随着代码的运行而增长

不幸的是,当我的python程序退出时,文件内容消失了。文件未损坏,但所有值均为
0.0
(我设置的填充值)。 我确保文件
f
已使用
f.close()
关闭,并且在关闭文件后(但在退出程序之前),文件仍然完好无损,内容仍然存在

有人熟悉这种行为并能解释那里发生了什么吗?我将感谢任何帮助

为了给你更多的信息,这里是我具体做的。我创建了一个
进程
,该进程处理
队列
的结果。初始化流程时,将创建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!

虽然这无法解决文件内容为何会消失的问题,但您应该记住,HDF5(以及h5py)的设计目的并不是让多个程序(使用多处理通常属于这种情况)写入同一文件。在1.10中有MPI支持和SWMR(单写多读),但您没有完全的自由以任何顺序写任何东西

我能想到的唯一问题是进程的init方法是在主线程中执行的。可能会将hdf5文件的打开位置移动到run方法的开头??