Освобождение памяти огромного массива numpy в IPython
UPDATE: - Эта проблема решена после перезагрузки компьютера. Пока еще не удалось выяснить, почему эта ошибка происходила раньше.
У меня есть функция, которая загружает огромный массив numpy (~ 980 МБ) и возвращает его.
Когда я впервые запускаю Ipython и вызываю эту функцию, он без проблем загружает массив в переменную.
Но если я снова запустил ту же команду, она выйдет из строя "Ошибка памяти".
Я попробовал следующее:
del hugeArray
По-прежнему была ошибка.
Я даже попробовал следующее
del hugeArray
gc.collect()
gc.collect()
Изначально gc.collect()
вернул 145, а второй вызвал 48.
Но даже после этого, когда я вызываю функцию, она все еще поднимает ошибку памяти.
Единственный способ, которым я мог снова загрузиться, - перезапустить ipython.
Есть ли что-то, что я могу сделать, чтобы освободить всю память в ipython, так что мне не нужно ее перезапускать?
---------------- Update
Ниже представлен вывод %whos
Variable Type Data/Info
------------------------------
gc module <module 'gc' (built-in)>
gr module <module 'Generate4mRamp' <...>rom 'Generate4mRamp.pyc'>
np module <module 'numpy' from '/us<...>ages/numpy/__init__.pyc'>
plt module <module 'matplotlib.pyplo<...>s/matplotlib/pyplot.pyc'>
Из этого, gr - мой модуль, содержащий функцию, которую я использовал для загрузки куба данных.
--------- Воспроизведение ошибки
Следующая простая функция способна воспроизвести ошибку.
import numpy as np
import gc
def functionH():
cube=np.zeros((200,1024,1024))
return cube
testcube=functionH() #Runs without any issue
del testcube
testcube=functionH() # Raises Memory Error
del testcube
gc.collect()
gc.collect()
testcube=functionH() # Still Raises Memory Error
Эта ошибка возникает только в Ipython. В простом python ( → > ) после предоставления del testcube
Ошибка памяти.
Ответы
Ответ 1
Вы смотрите на ценность? IPython кэширует выходные переменные, например. Out[8]
, поэтому, если вы его изучите, он будет сохранен в памяти.
Вы можете сделать %xdel testcube
, чтобы удалить переменную и удалить ее из кеша IPython. Альтернативно, %reset out
или %reset array
очистят либо всю вашу историю вывода, либо только ссылки на массивы numpy.