Форум сайта python.su
Здравствуйте, существует ли в Python возможность принудительной очистки памяти. Например, можно ли удалить из памяти ненужный массив до завершения работы скрипта?
Офлайн
Обычно достаточно удалить ссылку на объект:
arr = [...] arr[:] = [] # очистит список по всем ссылкам, например если где-то есть b = arr # или просто arr = None
import gc gc.collect()
Отредактировано reclosedev (Янв. 31, 2013 16:24:13)
Офлайн
Благодарю за совет но у меня возникает проблема Python не отдает ресурсы системе
ни gc.collect() ни del не del b не возвращают памяти операционной системе… У меня Python 2.7.3
выход найден http://docs.python.org/2/c-api/memory.html после этого память действительно возвращается но неужели нет другого способа вернуть занятую питоном память системе?
Офлайн
Нашел хороший ответ и решение и похоже решение проблемы
Found this also to be answered by Alex Martelli in another thread.
Unfortunately (depending on your version and release of Python) some types of objects use “free lists” which are a neat local optimization but may cause memory fragmentation, specifically by making more an more memory “earmarked” for only objects of a certain type and thereby unavailable to the “general fund”.
The only really reliable way to ensure that a large but temporary use of memory DOES return all resources to the system when it's done, is to have that use happen in a subprocess, which does the memory-hungry work then terminates. Under such conditions, the operating system WILL do its job, and gladly recycle all the resources the subprocess may have gobbled up. Fortunately, the multiprocessing module makes this kind of operation (which used to be rather a pain) not too bad in modern versions of Python.
In your use case, it seems that the best way for the subprocesses to accumulate some results and yet ensure those results are available to the main process is to use semi-temporary files (by semi-temporary I mean, NOT the kind of files that automatically go away when closed, just ordinary files that you explicitly delete when you're all done with them).
import multiprocessing def run_as_process(func, *args): p = multiprocessing.Process(target=func, args=args) try: p.start() a = range(100000000000) finally: p.terminate()
Отредактировано med_phisiker (Фев. 3, 2013 14:21:41)
Офлайн