MemoryError:无法为形状15500、2、240、240、1和数据类型为int16的数组分配3.33 GiB

问题描述

要在Windows 7 64位(具有16Gb RAM和...)上运行我正在使用PyCharm最新版本的代码

Python version: 3.7.7 (default,May  6 2020,11:45:54) [MSC v.1916 64 bit (AMD64)]

我正在尝试使用BraTS 2019 dataset中的SimplyITK和Numpy加载很多NIFTI图像。

这是我用来将图像加载到numpy数组中的代码

import SimpleITK as sitk


def read_nifti_images(images_full_path):
    """ 
    Read nifti files from a gziped file.
  
    Read nifti files from a gziped file using SimpleITK library.
  
    Parameters: 
    images_full_path (string): Full path to gziped file including file name.
  
    Returns: 
    SimpleITK.SimpleITK.Image,numpy array: images read as image,images read as numpy array 
  
    """
    # Reads images using SimpleITK.
    images = sitk.ReadImage(images_full_path)
    # Get a numpy array from a SimpleITK Image.
    images_array = sitk.GetArrayFromImage(images)
    
    # More info about SimpleITK images: http://simpleitk.github.io/SimpleITK-Notebooks/01_Image_Basics.html
    
    return images,images_array

代码适用于最小的数据集。我正在尝试加载518个nii.gz文件,每个文件包含155张图像。

当我运行代码时,使用了4GiB的RAM,而当达到8GiB时,它将引发异常。

是否可以将所有图像加载到内存中? Windows和/或PyCharm中可能存在内存使用限制。

解决方法

您在内存中有两个图像副本,一个SimpleITK版本和一个numpy版本。因此,当您击中8 gig图像时,您确实有16 gig的内存,因此崩溃了。

您可以尝试使用sitk.GetArrayViewFromImage。从SimpleITK转换为numpy时,并不会生成图像的全新副本。它创建一个numpy数据结构,该结构指向与SimpleITK图像相同的像素缓冲区。