Подтвердить что ты не робот

Освобождение памяти огромного массива 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 Ошибка памяти.

4b9b3361

Ответ 1

Вы смотрите на ценность? IPython кэширует выходные переменные, например. Out[8], поэтому, если вы его изучите, он будет сохранен в памяти.

Вы можете сделать %xdel testcube, чтобы удалить переменную и удалить ее из кеша IPython. Альтернативно, %reset out или %reset array очистят либо всю вашу историю вывода, либо только ссылки на массивы numpy.