Как может я явно свободная память в Python?

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

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

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

336
задан Aaron Hall 25 November 2013 в 09:26
поделиться

8 ответов

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

import gc
gc.collect()
376
ответ дан 23 November 2019 в 00:41
поделиться

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

biglist = [blah,blah,blah]
#...
del biglist
29
ответ дан 23 November 2019 в 00:41
поделиться

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

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

104
ответ дан 23 November 2019 в 00:41
поделиться

Другие опубликовали несколько способов, с помощью которых вы могли бы «уговорить» интерпретатор Python освободить память (или иным образом избежать проблем с памятью). Скорее всего, вам стоит сначала попробовать их идеи. Однако я считаю важным дать вам прямой ответ на ваш вопрос.

На самом деле нет никакого способа напрямую указать Python освободить память. Дело в том, что если вам нужен такой низкий уровень контроля, вам придется написать расширение на C или C ++.

Тем не менее, есть несколько инструментов, которые помогут с этим:

9
ответ дан 23 November 2019 в 00:41
поделиться

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

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

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

42
ответ дан 23 November 2019 в 00:41
поделиться

Вы не можете явно свободная память. Что вам нужно сделать, так это убедиться, что вы не храните ссылки на объекты. Затем они будут собраны в мусор, освобождая память.

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

http://www.prasannatech.net/2009/07/introduction-python-generators.html

22
ответ дан 23 November 2019 в 00:41
поделиться

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

3
ответ дан 23 November 2019 в 00:41
поделиться

( del может быть вашим другом, поскольку он отмечает объекты как удаляемые, когда на них нет других ссылок. Теперь интерпретатор CPython часто сохраняет эту память для дальнейшего использования , поэтому ваша операционная система может не видеть «освобожденную» память.)

Возможно, вы не столкнетесь ни с какими проблемами памяти, если бы использовали более компактную структуру для ваших данных. Таким образом, списки чисел намного менее эффективны с точки зрения памяти, чем формат, используемый стандартным модулем array или сторонним модулем numpy . Вы сэкономите память, поместив свои вершины в массив NumPy 3xN, а треугольники - в массив из N элементов.

19
ответ дан 23 November 2019 в 00:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: