Python: ошибка памяти Numpy при создании трехмерного массива.Какой лучший способ заполнить 3D-массив - PullRequest
0 голосов
/ 28 февраля 2019

Я делаю массив нулей и заполняю его.Но из-за размера массива он сталкивается с проблемами памяти даже при оперативной памяти 64 ГБ.Я делаю это неправильно?

X_train_one_hot имеет форму (47827, 30, 20000), а encInput имеет форму (47827, 30, 200)

X_train_one_hot_shifted = np.zeros((X_train_one_hot.shape[0], 30, 20200))
#X_train_one_hot.shape[0] = 48000
for j in range(0, X_train_one_hot.shape[0]):
    current = np.zeros((30, 20000))
    current[0][0] = 1

    current[1:] = X_train_one_hot[j][0:29]
#     print(current.shape, encInput[i].shape)
    combined = np.concatenate((current,encInput[j]), axis=1)

    X_train_one_hot_shifted[j] = combined

Любойидеи по снижению потребления памяти?Еще одна интересная вещь, поскольку форма X_train_one_hot также почти одинакова, но это не выдает никакой ошибки.

EDIT : Программа завершается в цикле for с сообщением об ошибке:

TERM_MEMLIMIT: задание прекращено после достижения лимита использования памяти LSF.

Кроме того, большая часть массива является разреженной, поскольку X_train_one_hot кодировка one_hot размером 20000

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Имтинан Азар прав.Вам просто не хватает оперативной памяти для хранения массива.

У вас есть несколько вариантов.

1) Кажется, у вас очень разреженная матрица, даже если размер большой.Таким образом, вы можете попробовать использовать одно из разреженных матричных представлений от Scipy.

Если вы добавляете массив в пакет библиотеки, такой как Scikit-Learn или в одну из этих библиотек глубокого обучения, это, скорее всего, не будет работать.

2) Большинство библиотек DL не нуждаютсявам загрузить все ваши данные сразу.Вы можете подготовить данные в пакетном режиме - создать эту матрицу в пакетном режиме и сохранить ее в файл (желательно с использованием разреженного представления матрицы).Затем используйте генератор данных для подачи вашего алгоритма или вручную загрузите пакеты данных для вашего алгоритма.

3) Если все это невозможно, вы можете попытаться отобразить массив в памяти, используя Numpy's memmap .Некоторые дополнительные примеры можно найти здесь .

4) Другой вариант - использовать dask и вручную получать фрагменты данных при необходимости.

Лично я бы выбрал вариант 2 или 1, если ваши алгоритмы, использующие матрицу, могут обрабатывать (или изменять для обработки) разреженные матрицы.

0 голосов
/ 28 февраля 2019

Давайте посмотрим, какая у вас X_train_one_hot_shifted.shape (48000, 30, 20200), то есть 28983162000 с плавающей точкой.

28983162000*8 показывает потребление памяти для этого массива в байтах.Что составляет 231865296000 байтов

Позволяет упростить это

231865296000 b

226430953.125 kb

221123.977661 mb

215.941384435 gb

Вам нужно 215 ГБ ОЗУ, чтобы вместить X_train_one_hot_shifted в вашу ОЗУ, я думаю, что форма 20200 - это опечатка, посмотрите ее

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