From f484137c43e9ecb32bfa584f0e26667cfc272c84 Mon Sep 17 00:00:00 2001 From: Thomas VINCENT Date: Thu, 28 Mar 2024 17:34:49 +0100 Subject: [PATCH 01/13] Add basic wrapper of tiled --- src/silx/io/tiledh5.py | 57 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 src/silx/io/tiledh5.py diff --git a/src/silx/io/tiledh5.py b/src/silx/io/tiledh5.py new file mode 100644 index 0000000000..5f6998f620 --- /dev/null +++ b/src/silx/io/tiledh5.py @@ -0,0 +1,57 @@ +"""Provides a wrapper to expose `Tiled `_""" +from __future__ import annotations + + +from functools import lru_cache +import numpy +from . import commonh5 +import tiled.client + + +def _getChildren(parent, container): + children = {} + for key, client in container.items(): + if isinstance(client, tiled.client.container.Container): + children[key] = TiledGroup(client, name=key, parent=parent) + elif isinstance(client, tiled.client.array.ArrayClient): + children[key] = TiledDataset(client, name=key, parent=parent) + return children + + +class TiledH5(commonh5.File): + def __init__(self, name=None, mode=None, attrs=None): + assert mode in ("r", None) + super().__init__(name, mode, attrs) + self.__container = tiled.client.from_uri(name) + assert isinstance(self.__container, tiled.client.container.Container) + + def close(self): + super().close() + self.__container = None + + @lru_cache + def _get_items(self): + return _getChildren(self, self.__container) + + +class TiledGroup(commonh5.Group): + """tiled Container wrapper""" + + def __init__(self, container, name, parent=None, attrs=None): + super().__init__(name, parent, attrs) + self.__container = container + + @lru_cache + def _get_items(self): + return _getChildren(self, self.__container) + + +class TiledDataset(commonh5.LazyLoadableDataset): + """tiled ArrayClient wrapper""" + + def __init__(self, client, name, parent=None, attrs=None): + super().__init__(name, parent, attrs) + self.__client = client + + def _create_data(self) -> numpy.ndarray: + return self.__client[()] From 70ea52dc8f30034e1375f0902e64f9a6feaafaf0 Mon Sep 17 00:00:00 2001 From: Thomas VINCENT Date: Thu, 28 Mar 2024 17:35:19 +0100 Subject: [PATCH 02/13] simple integration of tiled --- src/silx/io/utils.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/silx/io/utils.py b/src/silx/io/utils.py index 352b0c0db1..bfd45a4424 100644 --- a/src/silx/io/utils.py +++ b/src/silx/io/utils.py @@ -692,6 +692,11 @@ def open(filename): # pylint:disable=redefined-builtin :raises: IOError if the file can't be loaded or path can't be found :rtype: h5py-like node """ + if filename.startswith("tiled:"): + from .tiledh5 import TiledH5 + + return TiledH5(filename[6:]) + url = DataUrl(filename) if url.scheme() in [None, "file", "silx"]: From 24e18f8f0609b86daf7a48a8de0e163d890feec2 Mon Sep 17 00:00:00 2001 From: Thomas VINCENT Date: Tue, 2 Apr 2024 11:24:41 +0200 Subject: [PATCH 03/13] Load data on demand --- src/silx/io/tiledh5.py | 46 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/src/silx/io/tiledh5.py b/src/silx/io/tiledh5.py index 5f6998f620..0a13ba8285 100644 --- a/src/silx/io/tiledh5.py +++ b/src/silx/io/tiledh5.py @@ -3,18 +3,30 @@ from functools import lru_cache +import logging import numpy from . import commonh5 +import h5py import tiled.client -def _getChildren(parent, container): +_logger = logging.getLogger(__name__) + + +def _get_children(parent, container): children = {} for key, client in container.items(): if isinstance(client, tiled.client.container.Container): children[key] = TiledGroup(client, name=key, parent=parent) elif isinstance(client, tiled.client.array.ArrayClient): children[key] = TiledDataset(client, name=key, parent=parent) + else: + _logger.warning(f"Unsupported child type: {key}: {client}") + children[key] = commonh5.Dataset( + key, + numpy.array("Unsupported", h5py.special_dtype(vlen=str)), + parent=parent, + ) return children @@ -31,7 +43,7 @@ def close(self): @lru_cache def _get_items(self): - return _getChildren(self, self.__container) + return _get_children(self, self.__container) class TiledGroup(commonh5.Group): @@ -43,7 +55,7 @@ def __init__(self, container, name, parent=None, attrs=None): @lru_cache def _get_items(self): - return _getChildren(self, self.__container) + return _get_children(self, self.__container) class TiledDataset(commonh5.LazyLoadableDataset): @@ -55,3 +67,31 @@ def __init__(self, client, name, parent=None, attrs=None): def _create_data(self) -> numpy.ndarray: return self.__client[()] + + @property + def dtype(self): + return self.__client.dtype + + @property + def shape(self): + return self.__client.shape + + @property + def size(self): + return self.__client.size + + def __len__(self): + return len(self.__client) + + def __getitem__(self, item): + return self.__client[item] + + @property + def value(self): + return self.__client[()] + + def __iter__(self): + return self.__client.__iter__() + + def __getattr__(self, item): + return getattr(self.__client, item) From 3d50223c4cc2e39c39695414c01d6a2a531abc6c Mon Sep 17 00:00:00 2001 From: Thomas VINCENT Date: Wed, 10 Apr 2024 09:34:50 +0200 Subject: [PATCH 04/13] Keep tiled: prefix in name --- src/silx/io/tiledh5.py | 4 +++- src/silx/io/utils.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/silx/io/tiledh5.py b/src/silx/io/tiledh5.py index 0a13ba8285..0b2b6dd41a 100644 --- a/src/silx/io/tiledh5.py +++ b/src/silx/io/tiledh5.py @@ -34,7 +34,9 @@ class TiledH5(commonh5.File): def __init__(self, name=None, mode=None, attrs=None): assert mode in ("r", None) super().__init__(name, mode, attrs) - self.__container = tiled.client.from_uri(name) + self.__container = tiled.client.from_uri( + name[6:] if name.startswith("tiled:") else name + ) assert isinstance(self.__container, tiled.client.container.Container) def close(self): diff --git a/src/silx/io/utils.py b/src/silx/io/utils.py index bfd45a4424..9053db6bc1 100644 --- a/src/silx/io/utils.py +++ b/src/silx/io/utils.py @@ -695,7 +695,7 @@ def open(filename): # pylint:disable=redefined-builtin if filename.startswith("tiled:"): from .tiledh5 import TiledH5 - return TiledH5(filename[6:]) + return TiledH5(filename) url = DataUrl(filename) From 11d2e84bd38090652817b654fdc0a249d787681c Mon Sep 17 00:00:00 2001 From: Thomas VINCENT Date: Fri, 3 May 2024 14:50:31 +0200 Subject: [PATCH 05/13] add number of children limit, typing and docstring --- src/silx/io/tiledh5.py | 90 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 79 insertions(+), 11 deletions(-) diff --git a/src/silx/io/tiledh5.py b/src/silx/io/tiledh5.py index 0b2b6dd41a..cb0cc2f572 100644 --- a/src/silx/io/tiledh5.py +++ b/src/silx/io/tiledh5.py @@ -1,4 +1,30 @@ -"""Provides a wrapper to expose `Tiled `_""" +# /*########################################################################## +# Copyright (C) 2024 European Synchrotron Radiation Facility +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +# ############################################################################*/ +""" +Provides a wrapper to expose `Tiled `_ + +This is a preview feature. +""" from __future__ import annotations @@ -13,9 +39,26 @@ _logger = logging.getLogger(__name__) -def _get_children(parent, container): +def _get_children( + parent: TiledH5 | TiledGroup, + container: tiled.client.container.Container, + max_children: int | None = None, +): + """Return first max_children items of given container as commonh5 wrappers. + + :param parent: The commonh5 wrapper for which to retrieve children. + :param container: The corresponding tiled container. + :param max_children: The maximum number of childre to retrieve. + """ + items = container.items() + + if max_children is not None and len(items) > max_children: + _logger.warning( + f"{container.uri} contains too many entries: Only loading first {max_children}." + ) + children = {} - for key, client in container.items(): + for key, client in items.head(max_children): if isinstance(client, tiled.client.container.Container): children[key] = TiledGroup(client, name=key, parent=parent) elif isinstance(client, tiled.client.array.ArrayClient): @@ -31,12 +74,25 @@ def _get_children(parent, container): class TiledH5(commonh5.File): - def __init__(self, name=None, mode=None, attrs=None): + """tiled client wrapper""" + + MAX_CHILDREN: int | None = None + """Maximum number of group children to instantiate for each group. + + Set to None for allowing an unbound number of children per group. + """ + + def __init__( + self, + name: str, + mode: str | None = None, + attrs: dict | None = None, + ): assert mode in ("r", None) super().__init__(name, mode, attrs) - self.__container = tiled.client.from_uri( - name[6:] if name.startswith("tiled:") else name - ) + if name.startswith("tiled:"): + name = name[6:] + self.__container = tiled.client.from_uri(name) assert isinstance(self.__container, tiled.client.container.Container) def close(self): @@ -45,25 +101,37 @@ def close(self): @lru_cache def _get_items(self): - return _get_children(self, self.__container) + return _get_children(self, self.__container, self.MAX_CHILDREN) class TiledGroup(commonh5.Group): """tiled Container wrapper""" - def __init__(self, container, name, parent=None, attrs=None): + def __init__( + self, + container: tiled.client.container.Container, + name: str, + parent: TiledH5 | TiledGroup | None = None, + attrs: dict | None = None, + ): super().__init__(name, parent, attrs) self.__container = container @lru_cache def _get_items(self): - return _get_children(self, self.__container) + return _get_children(self, self.__container, self.file.MAX_CHILDREN) class TiledDataset(commonh5.LazyLoadableDataset): """tiled ArrayClient wrapper""" - def __init__(self, client, name, parent=None, attrs=None): + def __init__( + self, + client: tiled.client.array.ArrayClient, + name: str, + parent: TiledH5 | TiledGroup | None = None, + attrs: dict | None = None, + ): super().__init__(name, parent, attrs) self.__client = client From 13125ae572afce985990cdb9a848dc2ade66ba12 Mon Sep 17 00:00:00 2001 From: Thomas VINCENT Date: Fri, 3 May 2024 15:41:30 +0200 Subject: [PATCH 06/13] Change prefix from tiled: to tiled- to avoid issues with url parsing --- src/silx/io/tiledh5.py | 2 +- src/silx/io/utils.py | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/silx/io/tiledh5.py b/src/silx/io/tiledh5.py index cb0cc2f572..9841774e06 100644 --- a/src/silx/io/tiledh5.py +++ b/src/silx/io/tiledh5.py @@ -90,7 +90,7 @@ def __init__( ): assert mode in ("r", None) super().__init__(name, mode, attrs) - if name.startswith("tiled:"): + if name.startswith("tiled-http"): name = name[6:] self.__container = tiled.client.from_uri(name) assert isinstance(self.__container, tiled.client.container.Container) diff --git a/src/silx/io/utils.py b/src/silx/io/utils.py index 9053db6bc1..2424c47430 100644 --- a/src/silx/io/utils.py +++ b/src/silx/io/utils.py @@ -692,9 +692,7 @@ def open(filename): # pylint:disable=redefined-builtin :raises: IOError if the file can't be loaded or path can't be found :rtype: h5py-like node """ - if filename.startswith("tiled:"): - from .tiledh5 import TiledH5 - + if filename.startswith("tiled-http") and TiledH5 is not None: return TiledH5(filename) url = DataUrl(filename) From 0819f5b36cbf59a9b9fc66f3d43b060b0484f990 Mon Sep 17 00:00:00 2001 From: Thomas VINCENT Date: Fri, 3 May 2024 15:47:28 +0200 Subject: [PATCH 07/13] Rework silx.io.open to support tiled URL without prefix and try both h5pyd and tiled --- src/silx/io/utils.py | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/src/silx/io/utils.py b/src/silx/io/utils.py index 2424c47430..d6639c22f9 100644 --- a/src/silx/io/utils.py +++ b/src/silx/io/utils.py @@ -1,5 +1,5 @@ # /*########################################################################## -# Copyright (C) 2016-2023 European Synchrotron Radiation Facility +# Copyright (C) 2016-2024 European Synchrotron Radiation Facility # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -33,13 +33,11 @@ import time import logging from typing import Generator, Union, Optional -import urllib.parse import numpy from silx.utils.proxy import Proxy from .url import DataUrl -from . import h5py_utils from .._version import calc_hexversion import h5py @@ -51,6 +49,12 @@ except ImportError as e: h5pyd = None +try: + from .tiledh5 import TiledH5 +except ImportError as e: + TiledH5 = None + + logger = logging.getLogger(__name__) NEXUS_HDF5_EXT = [".h5", ".nx5", ".nxs", ".hdf", ".hdf5", ".cxi"] @@ -696,17 +700,30 @@ def open(filename): # pylint:disable=redefined-builtin return TiledH5(filename) url = DataUrl(filename) + if url.scheme() in ("http", "https"): + errors = [f"Failed to open {filename}"] + if h5pyd is not None: + try: + return _open_url_with_h5pyd(filename) + except Exception as e: + errors.append(f"- h5pyd failed: {type(e)} {e}") - if url.scheme() in [None, "file", "silx"]: - # That's a local file - if not url.is_valid(): - raise IOError("URL '%s' is not valid" % filename) - h5_file = _open_local_file(url.file_path()) - elif url.scheme() in ("http", "https"): - return _open_url_with_h5pyd(filename) - else: + if TiledH5 is not None: + try: + return TiledH5(filename) + except Exception as e: + errors.append(f"- tiled failed: {type(e)} {e}") + + raise IOError("\n".join(errors)) + + if url.scheme() not in (None, "file", "silx"): raise IOError(f"Unsupported URL scheme {url.scheme}: {filename}") + # That's a local file + if not url.is_valid(): + raise IOError("URL '%s' is not valid" % filename) + h5_file = _open_local_file(url.file_path()) + if url.data_path() in [None, "/", ""]: # The full file is requested if url.data_slice(): raise IOError(f"URL '{filename}' containing slicing is not supported") From 0c2c05ff2216d96b98217180d8edca8097e6625d Mon Sep 17 00:00:00 2001 From: Thomas VINCENT Date: Fri, 3 May 2024 16:01:41 +0200 Subject: [PATCH 08/13] Update docstrings + rework way to clip items --- src/silx/io/tiledh5.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/silx/io/tiledh5.py b/src/silx/io/tiledh5.py index 9841774e06..e6d35e2f38 100644 --- a/src/silx/io/tiledh5.py +++ b/src/silx/io/tiledh5.py @@ -44,21 +44,22 @@ def _get_children( container: tiled.client.container.Container, max_children: int | None = None, ): - """Return first max_children items of given container as commonh5 wrappers. + """Return first max_children entries of given container as commonh5 wrappers. :param parent: The commonh5 wrapper for which to retrieve children. - :param container: The corresponding tiled container. - :param max_children: The maximum number of childre to retrieve. + :param container: The tiled container from which to retrieve the entries. + :param max_children: The maximum number of children to retrieve. """ items = container.items() if max_children is not None and len(items) > max_children: + items = items.head(max_children) _logger.warning( f"{container.uri} contains too many entries: Only loading first {max_children}." ) children = {} - for key, client in items.head(max_children): + for key, client in items: if isinstance(client, tiled.client.container.Container): children[key] = TiledGroup(client, name=key, parent=parent) elif isinstance(client, tiled.client.array.ArrayClient): @@ -77,7 +78,7 @@ class TiledH5(commonh5.File): """tiled client wrapper""" MAX_CHILDREN: int | None = None - """Maximum number of group children to instantiate for each group. + """Maximum number of children to instantiate for each group. Set to None for allowing an unbound number of children per group. """ From 7ccc86b5a106ba23fa32dae81fe35f053a4f5aaa Mon Sep 17 00:00:00 2001 From: Thomas VINCENT Date: Fri, 3 May 2024 16:31:10 +0200 Subject: [PATCH 09/13] rename MAX_CHILDREN to MAX_CHILDREN_PER_GROUP --- src/silx/io/tiledh5.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/silx/io/tiledh5.py b/src/silx/io/tiledh5.py index e6d35e2f38..eb66a3b378 100644 --- a/src/silx/io/tiledh5.py +++ b/src/silx/io/tiledh5.py @@ -44,7 +44,7 @@ def _get_children( container: tiled.client.container.Container, max_children: int | None = None, ): - """Return first max_children entries of given container as commonh5 wrappers. + """Return first max_children entries of given container as a dict of commonh5 wrappers. :param parent: The commonh5 wrapper for which to retrieve children. :param container: The tiled container from which to retrieve the entries. @@ -77,7 +77,7 @@ def _get_children( class TiledH5(commonh5.File): """tiled client wrapper""" - MAX_CHILDREN: int | None = None + MAX_CHILDREN_PER_GROUP: int | None = None """Maximum number of children to instantiate for each group. Set to None for allowing an unbound number of children per group. @@ -102,7 +102,7 @@ def close(self): @lru_cache def _get_items(self): - return _get_children(self, self.__container, self.MAX_CHILDREN) + return _get_children(self, self.__container, self.MAX_CHILDREN_PER_GROUP) class TiledGroup(commonh5.Group): @@ -120,7 +120,7 @@ def __init__( @lru_cache def _get_items(self): - return _get_children(self, self.__container, self.file.MAX_CHILDREN) + return _get_children(self, self.__container, self.file.MAX_CHILDREN_PER_GROUP) class TiledDataset(commonh5.LazyLoadableDataset): From f2b248b3b6080b64f8815fd4f41b752412461ac4 Mon Sep 17 00:00:00 2001 From: Thomas VINCENT Date: Mon, 13 May 2024 15:38:17 +0200 Subject: [PATCH 10/13] remove support of tiled- prefix --- src/silx/io/tiledh5.py | 2 -- src/silx/io/utils.py | 3 --- 2 files changed, 5 deletions(-) diff --git a/src/silx/io/tiledh5.py b/src/silx/io/tiledh5.py index eb66a3b378..25b10b7ca4 100644 --- a/src/silx/io/tiledh5.py +++ b/src/silx/io/tiledh5.py @@ -91,8 +91,6 @@ def __init__( ): assert mode in ("r", None) super().__init__(name, mode, attrs) - if name.startswith("tiled-http"): - name = name[6:] self.__container = tiled.client.from_uri(name) assert isinstance(self.__container, tiled.client.container.Container) diff --git a/src/silx/io/utils.py b/src/silx/io/utils.py index d6639c22f9..f655ec0db8 100644 --- a/src/silx/io/utils.py +++ b/src/silx/io/utils.py @@ -696,9 +696,6 @@ def open(filename): # pylint:disable=redefined-builtin :raises: IOError if the file can't be loaded or path can't be found :rtype: h5py-like node """ - if filename.startswith("tiled-http") and TiledH5 is not None: - return TiledH5(filename) - url = DataUrl(filename) if url.scheme() in ("http", "https"): errors = [f"Failed to open {filename}"] From 0f74562e65470f262fb4b7470a3f93654a3fdc54 Mon Sep 17 00:00:00 2001 From: Thomas VINCENT Date: Mon, 13 May 2024 16:39:48 +0200 Subject: [PATCH 11/13] inherit from Dataset rather than lazy-loaded one --- src/silx/io/tiledh5.py | 26 ++++++-------------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/src/silx/io/tiledh5.py b/src/silx/io/tiledh5.py index 25b10b7ca4..ffbdd8b786 100644 --- a/src/silx/io/tiledh5.py +++ b/src/silx/io/tiledh5.py @@ -121,7 +121,7 @@ def _get_items(self): return _get_children(self, self.__container, self.file.MAX_CHILDREN_PER_GROUP) -class TiledDataset(commonh5.LazyLoadableDataset): +class TiledDataset(commonh5.Dataset): """tiled ArrayClient wrapper""" def __init__( @@ -131,36 +131,22 @@ def __init__( parent: TiledH5 | TiledGroup | None = None, attrs: dict | None = None, ): - super().__init__(name, parent, attrs) - self.__client = client - - def _create_data(self) -> numpy.ndarray: - return self.__client[()] - - @property - def dtype(self): - return self.__client.dtype + super().__init__(name, client, parent, attrs) @property def shape(self): - return self.__client.shape + return self._get_data().shape @property def size(self): - return self.__client.size + return self._get_data().size def __len__(self): return len(self.__client) def __getitem__(self, item): - return self.__client[item] + return self._get_data()[item] @property def value(self): - return self.__client[()] - - def __iter__(self): - return self.__client.__iter__() - - def __getattr__(self, item): - return getattr(self.__client, item) + return self._get_data()[()] From f82c450f23b866b3966c9b13fab5bd0b75add501 Mon Sep 17 00:00:00 2001 From: Thomas VINCENT Date: Mon, 13 May 2024 16:47:10 +0200 Subject: [PATCH 12/13] try using tiled cache --- src/silx/io/tiledh5.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/silx/io/tiledh5.py b/src/silx/io/tiledh5.py index ffbdd8b786..4bd2c8dea3 100644 --- a/src/silx/io/tiledh5.py +++ b/src/silx/io/tiledh5.py @@ -34,6 +34,7 @@ from . import commonh5 import h5py import tiled.client +from tiled.client.cache import Cache _logger = logging.getLogger(__name__) @@ -83,6 +84,9 @@ class TiledH5(commonh5.File): Set to None for allowing an unbound number of children per group. """ + _cache = None + """Shared tiled cache with lazy initialization""" + def __init__( self, name: str, @@ -91,7 +95,9 @@ def __init__( ): assert mode in ("r", None) super().__init__(name, mode, attrs) - self.__container = tiled.client.from_uri(name) + if self._cache is None: + TiledH5._cache = Cache() # Use tiled cache default + self.__container = tiled.client.from_uri(name, cache=self._cache) assert isinstance(self.__container, tiled.client.container.Container) def close(self): From cdf4af5c2723e8c5283d299097e67608d89c9b28 Mon Sep 17 00:00:00 2001 From: Thomas VINCENT Date: Wed, 28 Aug 2024 17:17:52 +0200 Subject: [PATCH 13/13] Advertise tiled as a preview feature --- src/silx/io/tiledh5.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/silx/io/tiledh5.py b/src/silx/io/tiledh5.py index 4bd2c8dea3..adb020b259 100644 --- a/src/silx/io/tiledh5.py +++ b/src/silx/io/tiledh5.py @@ -99,6 +99,7 @@ def __init__( TiledH5._cache = Cache() # Use tiled cache default self.__container = tiled.client.from_uri(name, cache=self._cache) assert isinstance(self.__container, tiled.client.container.Container) + _logger.warning("tiled support is a preview feature: This may change or be removed without notice.") def close(self): super().close()