From e4e4e23ed13efa4dbfa7cb13fc865bc2e1a28728 Mon Sep 17 00:00:00 2001 From: Christopher Rhodes <christopher.rhodes@embl.de> Date: Sun, 10 Nov 2024 17:02:23 +0100 Subject: [PATCH] Removed notion on unloading data from accessor --- model_server/base/accessors.py | 5 +---- model_server/base/session.py | 9 +++------ tests/base/test_accessors.py | 5 ----- tests/base/test_session.py | 2 +- 4 files changed, 5 insertions(+), 16 deletions(-) diff --git a/model_server/base/accessors.py b/model_server/base/accessors.py index 1241548a..a7d5453d 100644 --- a/model_server/base/accessors.py +++ b/model_server/base/accessors.py @@ -29,10 +29,6 @@ class GenericImageDataAccessor(ABC): def loaded(self): return self._data is not None - def unload(self): - self._data = None - self._metadata = None - @property def chroma(self): return self.shape_dict['C'] @@ -161,6 +157,7 @@ class GenericImageDataAccessor(ABC): @property def shape(self): + # TODO: cache this after loading data, so that subsequent functions don't re-load array return self.data.shape @property diff --git a/model_server/base/session.py b/model_server/base/session.py index c61d6a6e..c9058bb2 100644 --- a/model_server/base/session.py +++ b/model_server/base/session.py @@ -167,7 +167,6 @@ class _Session(object): self.log_info(f'Added accessor {accessor_id}') return accessor_id - # TODO: divergent cases between lazy file-backed accessor (with its own loaded state) and in-memory ones def del_accessor(self, accessor_id: str) -> str: """ Remove accessor object but retain its info dictionary @@ -180,16 +179,14 @@ class _Session(object): if isinstance(v, dict) and v['loaded'] is False: logger.warning(f'Accessor {accessor_id} is already deleted') else: - assert isinstance(v['object'], GenericImageDataAccessor) v['loaded'] = False v['object'] = None self.log_info(f'Deleted accessor {accessor_id}') return accessor_id - # TODO: call unload method on file-backed accessors def del_all_accessors(self) -> list[str]: """ - Remove (unload) all accessors but keep their info in dictionary + Remove all accessor objects but keep their info in dictionary :return: list of removed accessor IDs """ res = [] @@ -233,9 +230,9 @@ class _Session(object): self.del_accessor(acc_id) return acc - def write_accessor(self, acc_id: str, filename: Union[str, None] = None, pop: bool = True) -> str: + def write_accessor(self, acc_id: str, filename: Union[str, None] = None, pop: bool = False) -> str: """ - Write an accessor to file and optionally unload it from the session + Write an accessor to file and optionally remove its object from the session :param acc_id: accessor's ID :param filename: force use of a specific filename, raise InvalidPathError if this already exists :param pop: unload accessor from the session if True diff --git a/tests/base/test_accessors.py b/tests/base/test_accessors.py index bef1506d..cc363806 100644 --- a/tests/base/test_accessors.py +++ b/tests/base/test_accessors.py @@ -241,11 +241,6 @@ class TestCziImageFileAccess(unittest.TestCase): self.assertIsInstance(acc_cf._data, np.ndarray) self.assertIsInstance(acc_cf._metadata, dict) - # explicitly unload - acc_cf.unload() - self.assertIsNone(acc_cf._data) - self.assertIsNone(acc_cf._metadata) - class TestPatchStackAccessor(unittest.TestCase): def setUp(self) -> None: diff --git a/tests/base/test_session.py b/tests/base/test_session.py index 7a90a705..3d4f1187 100644 --- a/tests/base/test_session.py +++ b/tests/base/test_session.py @@ -151,7 +151,7 @@ class TestSessionPersistentData(unittest.TestCase): self.assertTrue(session.get_accessor_info(acc_id)['loaded']) # get accessor from session registry with popping - acc_get = session.get_accessor(acc_id) + acc_get = session.get_accessor(acc_id, pop=True) self.assertIsInstance(acc_get, InMemoryDataAccessor) self.assertEqual(acc_get.shape_dict, shd) self.assertFalse(session.get_accessor_info(acc_id)['loaded']) -- GitLab