如何在python中有效地存储非常大的列表

2024-04-20 04:44:00 发布

您现在位置:Python中文网/ 问答频道 /正文

问题:我有一个大的3D图像集合,我想存储到一个文件中。我应该如何有效地做到这一点?

背景:数据集约有1000个3D MRI图像,大小为256×256×156。为了避免频繁打开和关闭文件,我尝试将所有文件存储到一个大列表中并导出它。你知道吗

到目前为止,我试着把每一个核磁共振图像作为3D numpy数组读取,并将其添加到一个列表中。当我试图用numpy.保存,它消耗了我所有的内存并以“内存错误”退出。
以下是我尝试的代码:

import numpy as np
import nibabel as nib
import os

file_list = os.listdir('path/to/files')

for file in file_list:
    mri = nib.load(os.path.join('path/to/files',file))
    mri_array = np.array(mri.dataobj)
data.append(mri_array)

np.save('imported.npy',data)

预期结果

有没有更好的方法来存储这样的数据集而不消耗太多内存?你知道吗


Tags: 文件数据path内存图像importnumpy列表
1条回答
网友
1楼 · 发布于 2024-04-20 04:44:00

使用HDF5文件格式或Numpy的memmap是两个选项,如果您想将所有数据塞入一个文件中,我将首先使用这两个选项。这些选项不会将所有数据加载到内存中。你知道吗

Python有h5py包来处理HDF5文件。这些有很多特性,我通常倾向于这个选项。它看起来像这样:

import h5py

with h5py.File('data.h5') as h5file:
    for n, image in enumerate(mri_images):
        h5file[f'image{n}'] = image

memmap使用二进制文件,所以功能并不丰富。这看起来像:

import numpy as np

bin_file = np.memmap('data.bin', mode='w+', dtype=int, shape=(1000, 256, 256, 156))
for n, image in enumerate(mri_images):
    bin_file[n] = image
del bin_file    # dumps data to file

相关问题 更多 >