2013-12-10 2 views
16

Pythons gc.disable отключает автоматическую сборку мусора. Насколько я понимаю, это будет иметь некоторые побочные эффекты. Почему кто-то хочет отключить автоматическую сборку мусора и как можно эффективно управлять памятью без нее?Зачем отключать сборщик мусора?

ответ

16

Одним из способов отключения сборщика мусора является получение более последовательных результатов при определении времени выполнения кода. The timeit module делает.

def timeit(self, number=default_number): 
    if itertools: 
     it = itertools.repeat(None, number) 
    else: 
     it = [None] * number 
    gcold = gc.isenabled() 
    gc.disable() 
    ... 

In Python2 и до Python3.2gc.disable() также используется, чтобы избежать a bug caused by garbage collection occurring between fork and exec. Проблема, похоже, была исправлена ​​в Python3.3, без необходимости звонить gc.disable().

3

Другой вариант использования должен был бы вручную контролировать вывоз мусора с gc.collect()

+0

Но отключает GC сначала требование, чтобы иметь возможность использовать 'gc.collect()'? Или что такое прецедент для 'gc.collect()'? (примечание: у меня на самом деле был такой прецедент в прошлом в приложении C#, который вышел из памяти в ящике <512MiB) –

+0

Нет. Вы можете вызывать '' gc.collect() '' любое время AFAIK. –

6

Из той же странице, вы ссылаетесь на:

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

Таким образом, чтобы ответить на вторую часть вопроса, «как можно эффективно управлять памятью без него». Не создавайте ссылочные циклы. Конечно, это довольно ограниченный случай использования.

Для первой части вопроса ответ - исполнение. Опять же, довольно ограниченный случай использования.

Отключение GC помогло бы только в том случае, если (а) ГК фактически выполняет работу и (б) что работа ничего не добивается, то есть не находит ничего, чтобы освободить или находить так мало, что вы думаете, что ваша программа может допускайте утечку до тех пор, пока GC отключен. Таким образом, если ваша программа слишком медленная и не создает эталонные циклы, и отключить GC, похоже, ускорит ее, тогда вы рассмотрите возможность отключения GC.

Я предполагаю (на основе предыдущего GC, что я видел, а не Python в частности), что, если вы не выделяете какую-либо память, сборщик мусора не будет иметь долгосрочных эксплуатационных расходов. Это может иметь краткосрочную и непредсказуемую стоимость, убирающую то, что было раньше. Поэтому даже в случае, когда вы переходите к массивной процедуре хрустания numpy и думаете, что вам следует попытаться сжать всю возможную производительность из этой части кода, отключив GC, пока вы это сделаете, это все равно не поможет. Это просто задержит временные затраты на очистку предыдущих эталонных циклов до тех пор, пока вы не включите GC.

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

+0

Проблема заключается в том, что на практике трудно (без границ) гарантировать, что у вас нет ссылочных циклов. Вы можете легко убедиться, что ваш код не работает, но как насчет ваших зависимостей? Поскольку модули, функции и классы обычно не указывают, создают ли циклы ссылок, вам придется пройти через код каждой зависимости и транзитивной зависимости (включая стандартную библиотеку) и убедиться, что такие ссылки не выполняются. И, конечно, повышение зависимости может привести к циклу. – Kevin

+0

@Kevin: совершенно. Думаю, я намеревался «довольно ограниченным» быть ироничным преуменьшением. –

5

Проблема с включенным GC всегда заключается в том, что вы не знаете , когда это произойдет. Таким образом, если (часть) ваша программа критически важна, она нуждается в режиме реального времени и т. Д., Тогда вы можете отключить GC для времени (той части) вашей программы.

Если вы хотите снова включить автоматический GC, или если вы предпочитаете делать это вручную, позвонив по телефону gc.collect(), это не относится к этому вопросу.

Кроме того, некоторые программы предназначены для запуска только очень короткое время, поэтому разработчик может гарантировать, что в течение этого времени не может возникнуть проблема с памятью (рассмотрите такие программы, как ls); то этим аспектом GC можно пренебречь в пользу производительности.

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