Spaces:
Running
Running
File size: 1,490 Bytes
536551b | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | from collections import OrderedDict
from threading import Lock
from typing import Dict, Optional
import openslide
class SlideCache:
def __init__(self, max_items: int = 8) -> None:
self._max_items = max_items
self._slides: Dict[str, openslide.OpenSlide] = OrderedDict()
self._lock = Lock()
def get(self, slide_id: str) -> Optional[openslide.OpenSlide]:
with self._lock:
slide = self._slides.get(slide_id)
if slide is None:
return None
self._slides.move_to_end(slide_id)
return slide
def put(self, slide_id: str, path: str) -> openslide.OpenSlide:
with self._lock:
if slide_id in self._slides:
self._slides.move_to_end(slide_id)
return self._slides[slide_id]
slide = openslide.OpenSlide(path)
self._slides[slide_id] = slide
self._slides.move_to_end(slide_id)
while len(self._slides) > self._max_items:
_, oldest = self._slides.popitem(last=False)
try:
oldest.close()
except Exception:
pass
return slide
cache = SlideCache()
def load_slide(slide_id: str, path: str) -> openslide.OpenSlide:
return cache.put(slide_id, path)
def get_slide(slide_id: str) -> Optional[openslide.OpenSlide]:
return cache.get(slide_id)
|