2016-04-23 62 views
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! 
+0

我能想到的唯一问题是Process的__init__方法在主线程中执行。也许把hdf5文件的开头移到run方法的开头? – Trilarion

回答

0

虽然这不会解决,为什么文件的内容似乎消失了,你应该记住,HDF5(因此h5py)没有被设计为写有多个程序(使用多处理通常属于这种情况)写入同一个文件。在1.10中有MPI支持和SWMR(单作者多读者),但是你没有完全的自由来以任何顺序写任何东西。