diff --git a/CHANGELOG.md b/CHANGELOG.md index ca7a0c70875..0d34454025d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,6 +50,8 @@ # BUG FIXES +* `cluster/leiden`: Fix an issue where insufficient shared memory (size of `/dev/shm`) causes the processing to hang. + * `utils/subset_vars`: Convert .var column used for subsetting of dtype "boolean" to dtype "bool" when it doesn't contain NaN values (PR #959). * `resources_test_scripts/annotation_test_data.sh`: Add a layer to the annotation reference dataset with log normalized counts (PR #960). diff --git a/src/cluster/leiden/script.py b/src/cluster/leiden/script.py index 03a39be5802..91137385adc 100644 --- a/src/cluster/leiden/script.py +++ b/src/cluster/leiden/script.py @@ -45,7 +45,7 @@ "uns_name": "leiden", "output_compression": "gzip", } -meta = {"cpus": 8, "resources_dir": "."} +meta = {"cpus": 8, "resources_dir": "src/utils"} ## VIASH END sys.path.append(meta["resources_dir"]) @@ -55,6 +55,13 @@ _shared_logger_name = "leiden" +# Function to check available space in /dev/shm +def get_available_shared_memory(): + shm_path = "/dev/shm" + shm_stats = os.statvfs(shm_path) + return shm_stats.f_bsize * shm_stats.f_bavail + + class SharedNumpyMatrix: def __init__( self, @@ -70,6 +77,13 @@ def __init__( def from_numpy( cls, memory_manager: managers.SharedMemoryManager, array: npt.ArrayLike ): + available_shared_memory = get_available_shared_memory() + n_bytes_required = array.nbytes + if available_shared_memory < n_bytes_required: + raise ValueError( + "Not enough shared memory (/dev/shm) is available to load the data. " + f"Required amount: {n_bytes_required}, available: {available_shared_memory}." + ) shm = memory_manager.SharedMemory(size=array.nbytes) array_in_shared_memory = np.ndarray( array.shape, dtype=array.dtype, buffer=shm.buf