Найти - Пользователи
Полная версия: Очистка оперативной памяти в Python
Начало » Python для экспертов » Очистка оперативной памяти в Python
1
med_phisiker
Здравствуйте, существует ли в Python возможность принудительной очистки памяти. Например, можно ли удалить из памяти ненужный массив до завершения работы скрипта?
reclosedev
Обычно достаточно удалить ссылку на объект:
arr = [...]
arr[:] = []  # очистит список по всем ссылкам, например если где-то есть b = arr
# или просто
arr = None

Можно принудительно вызвать сборщик мусора:
import gc
gc.collect()
med_phisiker
Благодарю за совет но у меня возникает проблема Python не отдает ресурсы системе
ни gc.collect() ни del не del b не возвращают памяти операционной системе… У меня Python 2.7.3
выход найден http://docs.python.org/2/c-api/memory.html после этого память действительно возвращается но неужели нет другого способа вернуть занятую питоном память системе?
med_phisiker
Нашел хороший ответ и решение и похоже решение проблемы
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()
вначале создает под процесс pythonw.exe который ест память, потом уничтожает его возвращая память системе как так нужно поэкспериментировать
Метод сработал! )
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB