Наиболее эффективный способ объединения больших массивов numpy

#python #arrays #numpy

Вопрос:

Я работаю над генератором данных для модели машинного обучения, которая принимает видеокадры в качестве входных данных. Видео (вместе с необходимыми метками) хранятся в виде файлов hdf5, всего 11, каждый из которых содержит отдельное видео. Общий размер кадров составляет около 80 ГБ, и у меня есть 60 ГБ доступной памяти, но у меня выделено более чем достаточно подкачки.

Я хочу, чтобы процесс генерации был как можно более быстрым, чтобы он не стал узким местом для обучения. Для этой цели я сначала загружаю все данные в память перед выборкой в каждую эпоху. Я извлекаю массивы numpy из каждого файла hdf5, добавляю его в список, а затем объединяю содержимое списка в большой массив numpy. Процесс выборки действительно намного быстрее, чем выборка из файлов hdf5, поскольку они не загружают содержимое в память.

Моя проблема связана с первоначальным распределением данных. Поскольку я объединяю список, содержащий массивы numpy, размер которых составляет около 80 ГБ, np.concatenate выделяет еще 80 ГБ для перемещения данных, поскольку они не «на месте». Он по-прежнему может выделить необходимое пространство, но для его выделения требуется значительное количество времени, а затем скопировать данные в новое пространство, что становится узким местом каждый раз, когда вы начинаете новую тренировку.

Есть ли лучший способ объединить список больших массивов numpy (7~8 ГБ каждый) без перераспределения памяти, если это возможно. Или вы бы начали загружать данные другим способом. Я ищу самый быстрый способ, который гарантирует, что выборка не станет узким местом для обучения, сохраняя при этом время, необходимое для загрузки данных, до минимума.

Еще одна вещь, мне было интересно, будет ли сохранение массива numpy в конце и загрузка его с помощью np.load будет быстрее, чем при использовании формата hdf5, или нет, принимая во внимание большой размер данных.

Комментарии:

1. Массив должен иметь непрерывную память, поэтому вы не можете создать один массив из многих без такого рода копирования. tensorflow и аналогичные пакеты машинного обучения могут работать с «пакетами». В зависимости от того, что вам нужно сделать с массивами, что-то подобное может быть быстрее, чем создание одного большого массива.

2. @hpaulj В конечном счете, я хотел бы провести случайную выборку всех данных для каждой партии, поэтому предварительная загрузка всех данных сначала быстрее во время обучения. Я не думаю, что массив такого размера может быть смежным, поэтому это может быть невозможно, как вы сказали. Просто интересно, может ли быть лучший подход.