Persistence#

This example demonstrates saving and loading workspaces with HDF5.

Saving a Workspace#

from datalab_kernel import Workspace, Plotter
from sigima import create_signal, create_image
import numpy as np

# Create workspace with objects
workspace = Workspace()

# Add signals
t = np.linspace(0, 10, 1000)
workspace.add("sine", create_signal("Sine Wave", t, np.sin(t)))
workspace.add("cosine", create_signal("Cosine Wave", t, np.cos(t)))

# Add image
data = np.random.rand(128, 128).astype(np.float32)
workspace.add("noise", create_image("Random Noise", data))

print("Objects:", workspace.list())

# Save to HDF5
workspace.save("my_analysis.h5")
print("Workspace saved to my_analysis.h5")

Loading a Workspace#

# Create new workspace
workspace2 = Workspace()

# Load from HDF5
workspace2.load("my_analysis.h5")

print("Loaded objects:", workspace2.list())

# Verify data integrity
original_sine = workspace.get("sine")
loaded_sine = workspace2.get("sine")

np.testing.assert_array_equal(original_sine.x, loaded_sine.x)
np.testing.assert_array_equal(original_sine.y, loaded_sine.y)
print("Data integrity verified!")

Incremental Saves#

workspace = Workspace()

# Initial work
workspace.add("signal1", create_signal("First", t, np.sin(t)))
workspace.save("work_v1.h5")

# More work
workspace.add("signal2", create_signal("Second", t, np.cos(t)))
workspace.save("work_v2.h5")

# Now you have checkpoints at each version

Live Mode Persistence#

Persistence also works in live mode:

workspace = Workspace()  # May be live or standalone

# Save current DataLab state
workspace.save("datalab_snapshot.h5")

# Load into same or different workspace
# In live mode, objects are added to DataLab
workspace.load("datalab_snapshot.h5")

HDF5 File Structure#

The saved HDF5 file contains:

my_analysis.h5
├── signals/
│   ├── sine/
│   │   ├── x [dataset]
│   │   ├── y [dataset]
│   │   └── metadata [attributes]
│   └── cosine/
│       ├── x [dataset]
│       ├── y [dataset]
│       └── metadata [attributes]
└── images/
    └── noise/
        ├── data [dataset]
        └── metadata [attributes]

You can inspect the file with any HDF5 viewer (HDFView, h5py, etc.):

import h5py

with h5py.File("my_analysis.h5", "r") as f:
    print("Contents:")
    f.visititems(lambda name, obj: print(f"  {name}"))