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

时间:2016-04-23 09:26:33

标签: python io h5py

我正在使用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!

1 个答案:

答案 0 :(得分:0)

虽然这不能解决为什么文件内容似乎消失的原因,但你应该记住,HDF5(以及因此h5py)不是为了编写多个程序而设计的(使用多处理通常属于这个)写入同一个文件。在1.10中有MPI支持和SWMR(单个编写器多个读取器),但是您没有完全自由地以任何顺序编写任何内容。