Чтение больших файлов HDF5 - PullRequest
       116

Чтение больших файлов HDF5

0 голосов
/ 02 августа 2020

Я новичок в использовании файлов HDF5 и пытаюсь читать файлы с формой (20670, 224, 224, 3). Всякий раз, когда я пытаюсь сохранить результаты из hdf5 в список или другую структуру данных, это занимает так много времени, что я прерываю выполнение, или это приводит к сбою моего компьютера. Мне нужно уметь читать 3 набора файлов hdf5, использовать их данные, манипулировать ими, использовать их для обучения модели CNN и делать прогнозы.

Любая помощь для чтения и использования этих больших файлов HDF5 была бы очень оценен.

В настоящее время я читаю файл hdf5 следующим образом:

db = h5py.File(os.getcwd() + "/Results/Training_Dataset.hdf5")
training_db = list(db['data'])

Ответы [ 2 ]

1 голос
/ 03 августа 2020

Мой ответ обновлен 2020-08-03, чтобы отразить код, который вы добавили в свой вопрос. Как отметил @Tober, у вас заканчивается память. Чтение набора данных формы (20670, 224, 224, 3) станет списком сущностей 3.1G. Если вы прочитаете 3 набора изображений, потребуется еще больше оперативной памяти. Я предполагаю, что это данные изображения (возможно, 20670 изображений формы (224, 224, 3))? Если это так, вы можете читать данные в срезах как с h5py, так и tables (Pytables). Это вернет данные в виде массива NumPy, который вы можете использовать напрямую (нет необходимости манипулировать с другой структурой данных).

Basi c процесс будет выглядеть так:

with h5py.File(os.getcwd() + "/Results/Training_Dataset.hdf5",'r') as db:
     training_db = db['data']
     # loop to get images 1 by 1
     for icnt in range(20670) :
         image_arr = training_db [icnt,:,:,:}

     # then do something with the image

Вы также можете прочитать несколько изображений, установив первый индекс в диапазон (скажем, icnt:icnt+100), а затем соответствующим образом обработать цикл.

0 голосов
/ 02 августа 2020

Сбои, вероятно, означают, что вам не хватает памяти. Как и предложил Винь sh Пиллэй, я бы попробовал разбить данные на части и работать над небольшими частями за раз. Если вы используете метод pandas read_hdf , вы можете использовать параметры итератора и chunksize для управления разбиением на фрагменты:

import pandas as pd
data_iter = pd.read_hdf('/tmp/test.hdf', key='test_key', iterator=True, chunksize=100)
for chunk in data_iter:
   #train cnn on chunk here
   print(chunk.shape)

Обратите внимание, что для этого требуется, чтобы hdf был в формате таблицы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...