You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Calling data.show() on an InSituData object with a RegionsData containing many keys is very slow. Each key in RegionsData is rendered as a separate napari Shapes layer via _add_geometries_as_layer() (one viewer.add_shapes() call per key). With ~20+ region keys, the viewer can take 30+ seconds to open.
Root cause
In insitupy/interactive/_layers.py, _add_geometries_as_layer() calls viewer.add_shapes() once per RegionsData key. This triggers a known napari performance bottleneck (napari/napari#1562) for every layer:
CPU-side polygon triangulation and mesh generation (vispy) per layer
Z-order reindexing of the Shapes mesh on every shape addition (O(n²) during init)
Repeated thumbnail generation during Shapes.__init__
importinsitupyasispydata=ispy.InSituData.read("path/to/project/")
# data.regions has 30 keys -> 30 separate viewer.add_shapes() callsdata.show() # very slow
Proposed solutions
Consolidate region keys into fewer Shapes layers - The most impactful fix. Rather than one layer per RegionsData key, group all region polygons into a single Shapes layer and use the properties dict (e.g. properties={"key": [...], "class_name": [...]}) to encode per-polygon metadata. This reduces viewer.add_shapes() from O(n_keys) to O(1). The existing sync_geometries() logic would need updating to parse layer properties back into the key/class structure.
Block canvas redraws during batch insertion - As a lighter fix, wrap the loop over region keys in an event blocker:
This avoids redundant Qt redraws between layer insertions.
Defer thumbnail generation - Shapes layer performance napari/napari#1562 identified repeated thumbnail updates during Shapes.__init__ as a major overhead. Until this is fixed upstream, it could be partially mitigated by deferring viewer.add_shapes() calls (e.g. lazy layer creation on first pan/zoom into a region).
Description
Calling
data.show()on anInSituDataobject with aRegionsDatacontaining many keys is very slow. Each key inRegionsDatais rendered as a separate napari Shapes layer via_add_geometries_as_layer()(oneviewer.add_shapes()call per key). With ~20+ region keys, the viewer can take 30+ seconds to open.Root cause
In
insitupy/interactive/_layers.py,_add_geometries_as_layer()callsviewer.add_shapes()once perRegionsDatakey. This triggers a known napari performance bottleneck (napari/napari#1562) for every layer:Shapes.__init__Minimal example
Proposed solutions
Consolidate region keys into fewer Shapes layers - The most impactful fix. Rather than one layer per
RegionsDatakey, group all region polygons into a single Shapes layer and use thepropertiesdict (e.g.properties={"key": [...], "class_name": [...]}) to encode per-polygon metadata. This reducesviewer.add_shapes()from O(n_keys) to O(1). The existingsync_geometries()logic would need updating to parse layer properties back into the key/class structure.Block canvas redraws during batch insertion - As a lighter fix, wrap the loop over region keys in an event blocker:
This avoids redundant Qt redraws between layer insertions.
Defer thumbnail generation - Shapes layer performance napari/napari#1562 identified repeated thumbnail updates during
Shapes.__init__as a major overhead. Until this is fixed upstream, it could be partially mitigated by deferringviewer.add_shapes()calls (e.g. lazy layer creation on first pan/zoom into a region).References