2016-04-23 8 views
3

Ich verwende h5py, um iterativ in ein großes Array mit Python zu schreiben. Es dauert ziemlich lange und ich kann beobachten, wie die Datei wächst, wenn der Code läuft.Inhalt der HDF5-Datei verschwindet nach Abschluss des Schreibvorgangs

Leider, wenn mein Python-Programm beendet wird, verschwindet der Dateiinhalt. Die Datei ist nicht beschädigt, aber alle Werte sind 0.0 (der Füllwert, den ich einstelle). Ich habe sichergestellt, dass die Datei f mit f.close() geschlossen wird, und nach dem Schließen der Datei (aber vor dem Beenden des Programms) war die Datei noch intakt und Inhalt war da.

Kennt jemand dieses Verhalten und kann erklären, was dort passiert? Ich würde mich über jede Hilfe freuen!

Um Ihnen ein bisschen mehr Informationen zu geben, hier ist, was ich konkret mache. Ich erstellte eine Process, die Ergebnisse von einem Queue verarbeitet. Wenn der Prozess initialisiert wird, wird die HDF5-Datei erstellt, und wenn das letzte Element in der Warteschlange erreicht ist, wird die Datei geschlossen. All dies scheint gut zu funktionieren (wie oben beschrieben), aber ich erwähne es, da ich nicht viel Erfahrung mit Prozessen habe und mich frage, ob das Dateihandling in der Prozessklasse das Problem sein könnte.

# 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

Das einzige Problem, das ich denken könnte ist, dass die __init__ Methode des Prozesses im Haupt-Thread ausgeführt wird. Vielleicht verschiebe die Öffnung der hdf5-Datei an den Anfang der Run-Methode ?? – Trilarion

Antwort

0

Während dies nicht ermitteln, warum der Inhalt der Datei zu verschwinden scheint, sollten Sie beachten, dass HDF5 (und damit halten:

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 

Der Prozess wird dann wie unten initialisiert und ausgeführt h5py) ist nicht darauf ausgelegt, mehrere Programme schreiben zu lassen (normalerweise wird Multiprocessing darunter verwendet), die in dieselbe Datei schreiben. Es gibt MPI-Unterstützung und SWMR (Single Writer Multiple Reader) in 1.10, aber Sie haben nicht die völlige Freiheit, irgendetwas in beliebiger Reihenfolge zu schreiben.

Verwandte Themen