2013-04-28 2 views
34

UPDATE: - Эта проблема решена после перезагрузки компьютера. Пока еще не удалось выяснить, почему эта ошибка происходила раньше.Освобождение памяти огромного массива numpy в IPython

У меня есть функция, которая загружает массив огромного размера (~ 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'> 

из этого, гр мой модуль, содержащий функцию, Я использовал для загрузки куба данных.

--------- Как Воспроизведите ошибку

Следующая простая функция способна воспроизвести ошибку.

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

Можете ли вы попробовать вызвать 'whos' в ipython, чтобы узнать, что занимает память? – tiago

+0

@tiago: Я добавил результат команды% whos. Он не показывает ничего, кроме загруженных модулей. – indiajoe

+0

Можете ли вы показать счетчик ссылок объекта перед его удалением? 'import sys; sys.getrefcount (testcube)' – HYRY

ответ

43

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

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

+0

Я не рассматривал значение в IPython. Но спасибо за эту информацию о кешировании Ipython. Я не знал об этом. Я попробую эту команду xdel также, когда эта ошибка произойдет в следующий раз. Сейчас все работает нормально. – indiajoe

+2

Есть ли причина, по которой это не работает должным образом? Я пытаюсь сделать что-то вроде 'list ([i ** 2 для i в диапазоне (30000000)])', чтобы проверить это, а затем попытаюсь выполнить сброс%. После этого пустой, но память все еще занята, как и до команды сброса, почему это может быть? Это похоже на удаление ссылки. но не освобождая память? – Marko

+0

Я должен добавить, что% reset, без 'out' делает работу. Он обе освобождает память и удаляет ссылки. Но я не хочу потерять свои переменные. Кроме того, это работает 'v = Out [18]% xdel v'. Почему это? – Marko

Смежные вопросы