diff --git a/model_server/base/accessors.py b/model_server/base/accessors.py index 4175ef9c09c9f78d4382750c000c0e264da5fe12..1241548a2c74e6dc2bc7ef0cc3913b5d258030e1 100644 --- a/model_server/base/accessors.py +++ b/model_server/base/accessors.py @@ -29,6 +29,10 @@ 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'] diff --git a/model_server/base/session.py b/model_server/base/session.py index 5f8c6611e7cd476a4d4a83cc53289d6b94744635..c61d6a6ea34bb316e21cbd61a94a736ac17656fa 100644 --- a/model_server/base/session.py +++ b/model_server/base/session.py @@ -186,6 +186,7 @@ class _Session(object): 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 diff --git a/tests/base/test_accessors.py b/tests/base/test_accessors.py index 2d9e9a6d2e6248021fdacef21e6024a3ca6d26a9..bef1506d8b08b256b645a8de6ed8904ef1c6cb1a 100644 --- a/tests/base/test_accessors.py +++ b/tests/base/test_accessors.py @@ -229,15 +229,23 @@ class TestCziImageFileAccess(unittest.TestCase): ) def test_lazy_load(self): + # initialize an accessor with lazy flag acc_cf = generate_file_accessor(data['czifile']['path'], lazy=True) - self.assertEqual(acc_cf._data, None) - self.assertEqual(acc_cf._metadata, None) + self.assertIsNone(acc_cf._data) + self.assertIsNone(acc_cf._metadata) + + # implicitly load by accessing its data property nda = acc_cf.data self.assertIsNotNone(acc_cf._data) self.assertIsNotNone(acc_cf._metadata) 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: