diff --git a/model_server/base/accessors.py b/model_server/base/accessors.py index 1241548a2c74e6dc2bc7ef0cc3913b5d258030e1..a7d5453d5ffcc90356540ee876e36169de4ebb28 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 c61d6a6ea34bb316e21cbd61a94a736ac17656fa..c9058bb2d0400ad80371dc2efd60505b8eadce7d 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 bef1506d8b08b256b645a8de6ed8904ef1c6cb1a..cc363806ef479797b7447f763b2f2c633f40e86c 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 7a90a70505482351b4fcfe653f7e68fcf78a462d..3d4f11870d7d97fbd4117c65d78d09ed7045394d 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'])