File load error: not enough storage available with 1.7TB storage free

File load error: not enough storage available with 1.7TB storage free

我正在使用以下代码将我的文件以 NiFTI 格式加载到 Python。

import nibabel as nib 

img_arr = []
for i in range(len(datadir)):
    img = nib.load(datadir[i])
    img_data = img.get_fdata()
    img_arr.append(img_data)
    img.uncache()

少量图片工作正常,但如果我想加载更多图片,我会收到以下错误:

OSError                                   Traceback (most recent call last)
<ipython-input-55-f982811019c9> in <module>()
     10     #img = nilearn.image.smooth_img(datadir[i],fwhm = 3) #Smoothing filter for preprocessing (necessary?)
     11     img = nib.load(datadir[i])
---> 12     img_data = img.get_fdata()
     13     img_arr.append(img_data)
     14     img.uncache()

~\AppData\Roaming\Python\Python36\site-packages\nibabel\dataobj_images.py in get_fdata(self, caching, dtype)
    346             if self._fdata_cache.dtype.type == dtype.type:
    347                 return self._fdata_cache
--> 348         data = np.asanyarray(self._dataobj).astype(dtype, copy=False)
    349         if caching == 'fill':
    350             self._fdata_cache = data

~\AppData\Roaming\Python\Python36\site-packages\numpy\core\_asarray.py in asanyarray(a, dtype, order)
    136 
    137     """
--> 138     return array(a, dtype, copy=False, order=order, subok=True)
    139 
    140 

~\AppData\Roaming\Python\Python36\site-packages\nibabel\arrayproxy.py in __array__(self)
    353     def __array__(self):
    354         # Read array and scale
--> 355         raw_data = self.get_unscaled()
    356         return apply_read_scaling(raw_data, self._slope, self._inter)
    357 

~\AppData\Roaming\Python\Python36\site-packages\nibabel\arrayproxy.py in get_unscaled(self)
    348                                        offset=self._offset,
    349                                        order=self.order,
--> 350                                        mmap=self._mmap)
    351         return raw_data
    352 

~\AppData\Roaming\Python\Python36\site-packages\nibabel\volumeutils.py in array_from_file(shape, in_dtype, infile, offset, order, mmap)
    507                              shape=shape,
    508                              order=order,
--> 509                              offset=offset)
    510             # The error raised by memmap, for different file types, has
    511             # changed in different incarnations of the numpy routine

~\AppData\Roaming\Python\Python36\site-packages\numpy\core\memmap.py in __new__(subtype, filename, dtype, mode, offset, shape, order)
    262             bytes -= start
    263             array_offset = offset - start
--> 264             mm = mmap.mmap(fid.fileno(), bytes, access=acc, offset=start)
    265 
    266             self = ndarray.__new__(subtype, shape, dtype=descr, buffer=mm,

OSError: [WinError 8] Not enough storage is available to process this command

我认为 img.uncache() 会从内存中删除图像,这样它就不会占用太多存储空间,但仍然能够使用图像数组。将此位添加到代码中并没有改变任何东西。

有谁知道我能帮上什么忙吗?我正在使用的计算机有 24 个核心 2.6 GHz CPU,内存超过 52 GB,工作目录有超过 1.7 TB 的可用存储空间。我正在尝试从 ADNI 数据库加载大约 1500 张 MRI 图像。

非常感谢任何建议。

此错误不是因为 1.7TB 硬盘驱动器 已满而引起的,这是因为您 运行 超出了 内存,又名RAMIt's going to be important to understand how those two things differ

uncache() 不会 完全从内存中删除项目,如记录 here,但 link 还包含更多内存节省技巧.

如果你想从内存中完全删除一个对象,你可以使用Garbage Collector interface,像这样:

import nibabel as nib 
import gc

img_arr = []
for i in range(len(datadir)):
    img = nib.load(datadir[i])
    img_data = img.get_fdata()
    img_arr.append(img_data)
    img.uncache()
    # Delete the img object and free the memory
    del img
    gc.collect()

这应该有助于减少您使用的内存量。

How to fix "not enough storage available.."?

  • 尝试执行以下步骤:

    1. 同时按下键盘上的Windows+R键,然后在运行window中输入Regedit.exe,点击好的。

    2. 然后展开HKEY_LOCAL_MACHINE,然后是SYSTEM,然后是CurrentControlSet,然后是services,然后是LanmanServer,然后是Parameters。

    3. 找到IRPStackSize(如果找到跳到第5步),如果不存在则右击Window选择New > Dword Value (32)

    4. 现在在名称下输入 IRPStackSize,然后按回车键。

    5. 右键单击 IRPStackSize 并单击“修改”,然后设置任何大于 15 但小于 50 的值并单击“确定”

    6. 重新启动系统并尝试重复发生错误时的相同操作。

  • 或:

    1. 将以下注册表项 HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\LargeSystemCache 设置为值“1”

    2. 设置以下注册表 HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\Size 为值“3”

另一种在 "nibabel" 中节省内存的方法:

除了 uncache() 方法还有其他节省内存的方法,您可以使用: