Вопрос-Ответ

How can I explicitly free memory in Python?

Как я могу явно освободить память в Python?

Я написал программу на Python, которая работает с большим входным файлом для создания нескольких миллионов объектов, представляющих треугольники. Алгоритм таков:


  1. прочитать входной файл

  2. обработайте файл и создайте список треугольников, представленных их вершинами

  3. выведите вершины в формате OFF: список вершин, за которым следует список треугольников. Треугольники представлены индексами в списке вершин

Требование OFF, чтобы я распечатывал полный список вершин перед распечаткой треугольников, означает, что я должен хранить список треугольников в памяти, прежде чем записывать выходные данные в файл. Тем временем я получаю ошибки памяти из-за размеров списков.

Каков наилучший способ сообщить Python, что мне больше не нужны некоторые данные, и их можно освободить?

Переведено автоматически
Ответ 1

Согласно официальной документации Python, вы можете явно вызвать сборщик мусора для освобождения памяти без ссылок с помощью gc.collect(). Пример:

import gc

gc.collect()

Вы должны сделать это после пометки того, что вы хотите удалить, используя del:

del my_array
del my_object
gc.collect()
Ответ 2

К сожалению (в зависимости от вашей версии и выпуска Python), некоторые типы объектов используют "свободные списки", которые являются аккуратной локальной оптимизацией, но могут вызывать фрагментацию памяти, в частности, делая все больше и больше памяти "выделенной" только для объектов определенного типа и, следовательно, недоступной для "общего фонда".

Единственный действительно надежный способ гарантировать, что большое, но временное использование памяти ДЕЙСТВИТЕЛЬНО вернет все ресурсы системе, когда это будет сделано, - это выполнить это использование в подпроцессе, который выполняет работу, требующую много памяти, а затем завершает ее. В таких условиях операционная система выполнит свою работу и с радостью переработает все ресурсы, которые, возможно, поглотил подпроцесс. К счастью, multiprocessing модуль выполняет такого рода операции (которые раньше были довольно болезненными) не так уж плохо в современных версиях Python.

В вашем случае использования кажется, что лучший способ для подпроцессов накопить некоторые результаты и при этом гарантировать, что эти результаты доступны основному процессу, - это использовать полупостоянные файлы (под полупостоянными я подразумеваю НЕ те файлы, которые автоматически удаляются при закрытии, а просто обычные файлы, которые вы явно удаляете, когда все с ними закончите).

Ответ 3

Оператор del может быть полезен, но IIRC не гарантирует, что он освободит память. Документы здесь ... и почему это не освобождается, здесь.

Я слышал, что люди в системах типа Linux и Unix разветвляют процесс python для выполнения некоторой работы, получения результатов, а затем завершают его.

В этой статье есть заметки о сборщике мусора Python, но я думаю, что недостаток управления памятью является недостатком управляемой памяти

Ответ 4

Python собирает мусор, поэтому, если вы уменьшите размер своего списка, он освободит память. Вы также можете использовать оператор "del", чтобы полностью избавиться от переменной:

biglist = [blah,blah,blah]
#...
del biglist
python