Open
Description
It seems that reading uncompressed nifti volumes takes significantly longer when memory mapping is enabled. In this example, I load four large 4D nifti volumes from the ABCD dataset, with and without memory mapping.
import time
import nibabel as nib
import numpy as np
print(nib.__version__)
def benchmark_nibabel_load(path: str, mmap: bool):
tic = time.monotonic()
img = nib.load(path, mmap=mmap)
data = np.asarray(img.get_fdata())
rt = time.monotonic() - tic
print(f"mmap: {mmap}, run time: {rt:.3f}s")
paths = [
"/ABCD/sub-NDARINV0CCVJ39W/ses-2YearFollowUpYArm1/func/sub-NDARINV0CCVJ39W_ses-2YearFollowUpYArm1_task-rest_run-04_bold.nii",
"/ABCD/sub-NDARINV0YE7L9KU/ses-2YearFollowUpYArm1/func/sub-NDARINV0YE7L9KU_ses-2YearFollowUpYArm1_task-rest_run-04_bold.nii",
"/ABCD/sub-NDARINV0F82C6R8/ses-2YearFollowUpYArm1/func/sub-NDARINV0F82C6R8_ses-2YearFollowUpYArm1_task-rest_run-02_bold.nii",
"/ABCD/sub-NDARINV0V80916L/ses-baselineYear1Arm1/func/sub-NDARINV0V80916L_ses-baselineYear1Arm1_task-rest_run-04_bold.nii",
]
mmaps = [True, False, True, False]
for path, mmap in zip(paths, mmaps):
benchmark_nibabel_load(path, mmap=mmap)
This is what I get, using nibabel v5.2.1:
mmap: True, run time: 90.764s
mmap: False, run time: 3.595s
mmap: True, run time: 37.405s
mmap: False, run time: 4.810s
Any idea why this might happen?