diff --git a/wsinfer/patchlib/patch.py b/wsinfer/patchlib/patch.py index 68fd737..3de742b 100644 --- a/wsinfer/patchlib/patch.py +++ b/wsinfer/patchlib/patch.py @@ -11,10 +11,23 @@ from shapely import Point from shapely import Polygon from shapely import STRtree +from contextlib import contextmanager +import sys +from typing import Iterator logger = logging.getLogger(__name__) +@contextmanager +def temporary_recursion_limit(limit: int) -> Iterator[None]: + old_limit = sys.getrecursionlimit() + try: + sys.setrecursionlimit(limit) + yield + finally: + sys.setrecursionlimit(old_limit) + + def get_multipolygon_from_binary_arr( arr: npt.NDArray[np.int_], scale: tuple[float, float] | None = None ) -> tuple[MultiPolygon, Sequence[npt.NDArray[np.int_]], npt.NDArray[np.int_]]: @@ -96,8 +109,10 @@ def merge_polygons(polygon: MultiPolygon, idx: int, add: bool) -> MultiPolygon: return polygon - # Call the function with an initial empty polygon and start from contour 0 - polygon = merge_polygons(MultiPolygon(), 0, True) + temp_limit = max(sys.getrecursionlimit(), len(contours)) + with temporary_recursion_limit(temp_limit): + # Call the function with an initial empty polygon and start from contour 0 + polygon = merge_polygons(MultiPolygon(), 0, True) # Add back the axis in hierarchy because we squeezed it before. return polygon, contours_unscaled, hierarchy[np.newaxis] diff --git a/wsinfer/write_geojson.py b/wsinfer/write_geojson.py index e281f08..2db5c1d 100644 --- a/wsinfer/write_geojson.py +++ b/wsinfer/write_geojson.py @@ -109,4 +109,4 @@ def write_geojsons(csvs: list[Path], results_dir: Path, num_workers: int) -> Non output.mkdir(parents=True, exist_ok=True) func = partial(make_geojson, results_dir=results_dir) - process_map(func, csvs, max_workers=num_workers) + process_map(func, csvs, max_workers=num_workers, chunksize=1)