Память взрывается при заполнении массива numpy - PullRequest
1 голос
/ 19 марта 2020

Я пытаюсь выяснить python проблему обработки памяти, возникающую при заполнении массива. Я заполняю огромный многомерный массив длиной [2048,3000,256,76], который я уже создал, поэтому его память уже выделена. Я заполняю его для l oop случайными числами, например, так:

import numpy as np

myarray = np.zeros((2048,3000,256,76))
for i in range(2048):
    myarray[i,:,:,:] = np.random.normal(0.,1.,[3000,256,76])

Однако, если я вижу память, которую использует процесс, она неуклонно увеличивается до такой степени, что мне приходится Я полагаю, что убить его, потому что предыдущие вызовы np.random.normal (значения которых я уже сохранил в myarray) не удаляются. Как я могу избавиться от них? Является ли это возможным? Я пытался запустить сборщик мусора, но это не сработало.

Я понимаю, что это довольно простой вопрос c, но все мои навыки выделения памяти основаны на C. Там было просто вопрос освобождения массивов / векторов, чтобы не попадать в подобные проблемы, но я не знаю, как перевести эти навыки в распоряжение объектными вызовами / созданием, кроме вызовов del и gc.

Заранее спасибо за любые указатели (каламбур)!

PS: Это всего лишь фрагмент кода игрушки из более крупной проблемы. Моя настоящая проблема связана с многопоточностью, но это может пролить свет на эту проблему.

1 Ответ

1 голос
/ 19 марта 2020

Ваш массив огромен. 891 ГиБ огромных, если быть точным. В моей системе windows я получаю MemoryError:

>>> myarray = np.zeros((2048,3000,256,76))
MemoryError: Unable to allocate 891. GiB for an array with shape (2048, 3000, 256, 76) and data type float64

, который я уже создал, поэтому его память уже выделена.

Это, к сожалению, не не правда. В системах, которые не windows, я полагаю, что ОС не выполняет распределение, пока вы не замените нули действительными данными, поэтому использование памяти продолжает расти.

...