У меня есть массив 601x350x200x146
numpy float64
, который, согласно моим вычислениям, занимает около 22,3 Гб памяти. Мой вывод free -m
говорит мне, что у меня есть около 100 ГБ свободной памяти, чтобы он соответствовал штрафу. Однако при интеграции сИзбегайте ошибок памяти при интеграции большого массива с Numpy
result = np.trapz(large_arr, axis=3)
У меня ошибка памяти. Я понимаю, что это из-за промежуточных массивов, которые необходимо создать для выполнения интеграции numpy.trapz
. Но я смотрю, есть ли способ обойти это, или, по крайней мере, способ минимизировать дополнительное использование памяти.
Я читал об ошибках памяти, и я знаю, что нужно сделать, чтобы избежать этого: один размещает вызов перед интеграцией. Я попробовал это, и это не сработало.
Другие используют операторы *=
, такие как запись arr*=a
вместо arr=arr*a
, что я действительно не могу здесь сделать. Поэтому я не знаю, что еще попробовать.
Кто-нибудь знает, как сделать эту операцию без повышения ошибки памяти?
Вы можете воспроизвести ошибку с:
arr = np.ones((601,350,200,146), dtype=np.float64)
arr=np.trapz(arr, axis=3)
хотя вам придется уменьшать размер, чтобы соответствовать размеру памяти.
Мне кажется, что этот массив составляет 49 гигабайт. NumPy много использует массивы промежуточных царапин; для реализации 'np.trapz' требуется больше тех, которые могут храниться в вашей памяти. – user2357112
Знаете ли вы, что делает 'trapz'? Даже если '' arr' сам подходит, временные массивы, созданные 'trapz', могут и не быть. – hpaulj
@ user2357112 Да, вот что я подумал. Но что вы говорите, это просто нет? – TomCho