Как эффективно хранить очень большой список в Python - PullRequest
1 голос
/ 02 апреля 2019

Вопрос : У меня есть большая коллекция 3D-изображений, которую я хотел бы сохранить в один файл. Как мне эффективно это сделать?

Фон : В наборе данных содержится около 1000 3D-изображений МРТ размером 256 на 256 на 156. Чтобы избежать частых открытий файлови близко, я пытался сохранить их все в один большой список и экспортировать его.

До сих пор я пытался считать каждую МРТ в виде трехмерного массива и добавить его в список.Когда я попытался сохранить его с помощью numpy.save, он занял всю мою память и вышел с «Ошибка памяти».
Вот код, который я попробовал:

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)

Ожидаемый результат :

Есть ли лучший способ хранить такой набор данных, не занимая слишком много памяти?

1 Ответ

1 голос
/ 02 апреля 2019

Использование формата файла HDF5 или Numpy's 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...