improved performance a lot, incremental writing of HDF5

This commit is contained in:
2026-07-13 16:55:52 +02:00
parent 6f7ca7ecaf
commit 65649bb307
2 changed files with 52 additions and 29 deletions
+28 -18
View File
@@ -506,9 +506,9 @@ class DamarisGUI:
print(f"DEBUG: start_experiment called at {overall_start}")
# something running?
if self.si is not None:
print("Last Experiment is not clearly stopped!")
self.si = None
if self.si is not None or self.state != DamarisGUI.Edit_State:
print("Experiment is still running or cleaning up!")
return
# get config values:
config_start = time.time()
@@ -744,6 +744,9 @@ class DamarisGUI:
"""
periodically look at running threads
"""
if self.si is None:
return False
# look at components and update them
# test whether backend and scripts are done
r = self.si.data.get( "__recentresult", -1 ) + 1
@@ -888,6 +891,11 @@ class DamarisGUI:
dump_size = os.stat( self.dump_filename ).st_size / 1e6
print("done (%.1f s, %.1f MB)" % (time.time( ) - self.dump_start_time, dump_size))
# keep data to display but throw away everything else
self.si = None
# delete lock file so that other experiment can start
self.lockfile.del_experiment(self.id)
# now everything is stopped
self.state = DamarisGUI.Edit_State
gdk.threads_enter( )
@@ -896,16 +904,12 @@ class DamarisGUI:
self.toolbar_stop_button.set_sensitive( False )
self.toolbar_pause_button.set_sensitive( False )
gdk.threads_leave( )
# keep data to display but throw away everything else
self.si = None
# delete lock file so that other experiment can start
self.lockfile.del_experiment(self.id)
return False
# dump states?
dump_interval = self.dump_timeinterval if self.dump_timeinterval > 0 else 2.0
if self.dump_thread is None and self.dump_filename != "" and \
self.dump_timeinterval != 0 and self.last_dumped + self.dump_timeinterval < time.time( ):
self.last_dumped + dump_interval < time.time( ):
print("dumping data pool")
self.dump_start_time = time.time( )
self.dump_dots = 0
@@ -1062,19 +1066,25 @@ class DamarisGUI:
dump_file.disable_undo( )
# save the data!
self.data.write_hdf5( dump_file, where="/", name="data_pool",
complib=self.dump_complib, complevel=self.dump_complevel,
incremental=not init, write_interval=self.dump_timeinterval )
if self.data is not None:
self.data.write_hdf5( dump_file, where="/", name="data_pool",
complib=self.dump_complib, complevel=self.dump_complevel,
incremental=not init, write_interval=self.dump_timeinterval )
# Re-enable run button if this was called from save thread
if not init and threading.current_thread().name == "dump states":
gdk.threads_enter()
self.toolbar_run_button.set_sensitive(True)
gdk.threads_leave()
# NO: this is dangerous as it allows starting a new experiment before cleanup is finished.
# it will be re-enabled in observe_running_experiment after joining this thread.
# if not init and threading.current_thread().name == "dump states":
# gdk.threads_enter()
# self.toolbar_run_button.set_sensitive(True)
# gdk.threads_leave()
# now save additional information
e = self.si.data.get( "__recentexperiment", -1 ) + 1
r = self.si.data.get( "__recentresult", -1 ) + 1
e = 0
r = 0
if self.si is not None:
e = self.si.data.get( "__recentexperiment", -1 ) + 1
r = self.si.data.get( "__recentresult", -1 ) + 1
timeline_table = dump_file.root.timeline
timeline_row = timeline_table.row
timeline_row[ "time" ] = time.strftime( "%Y%m%d %H:%M:%S" )