python - 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 中可能存在内存使用限制。
解决方案
您在内存中有两个图像副本,一个 SimpleITK 版本和一个 numpy 版本。因此,当您点击 8 gig 的图像时,您的内存中确实有 16 gig,因此您的崩溃。
您可以尝试使用 sitk.GetArrayViewFromImage。从 SimpleITK 转换为 numpy 时,这不会生成图像的全新副本。它创建了一个 numpy 数据结构,该结构指向与 SimpleITK 图像相同的像素缓冲区。
推荐阅读
- javascript - 在 javascript 中访问 json 数据
- javascript - 烧瓶简单密码保护页面加载
- computer-science - “ -> ab|ac”的扩展 BNF 是什么?
- python - numpy 如何实现将列表作为索引传递给获取和设置项目的功能?
- mysql - 在自定义运算符上使用 dagrun.conf
- php - App\Mail\EmailGenerator 类的对象无法转换为字符串
- javascript - 为什么我的控制器从 Axios 收到的值总是为空?
- bash - 意外的 EOF 在第 1 行中寻找匹配的 `"'...。什么给出了?
- java - 即使在覆盖哈希码和等于之后,Java Map 也无法正常工作
- python - 运行脚本的可执行文件的路径可能因用户而异