首页 > 解决方案 > MemoryError:无法为形状为 (15500, 2, 240, 240, 1) 且数据类型为 int16 的数组分配 3.33 GiB

问题描述

要运行代码,我在具有 16Gb RAM 的 Windows 7 64 位上使用 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 中可能存在内存使用限制。

标签: pythondatasetconv-neural-networksimpleitk

解决方案


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

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


推荐阅读