Просто измените функцию:
def notastonishinganymore(a = []): '''The name is just a joke :)'''
a = a[:]
a.append(5)
return a
Во-первых, важно отметить, что они отличаются друг от друга тем, что gc
не удаляет любые переменные , которые вы все еще используете, - только освобождает память для тех, более длинный доступ к (удаленный с помощью rm()
или, скажем, создан в функции, которая с тех пор вернулась). Запуск gc()
никогда не заставит вас потерять переменные.
Вопрос о том, следует ли вам называть gc()
после вызова rm()
, тем не менее, является хорошим. Документация для gc помогает:
Вызов gc вызывает сбор мусора. Это также будет происходить автоматически без вмешательства пользователя, и основная цель вызова gc - для отчета об использовании памяти.
Однако, может быть полезно вызвать gc после удаления большого объекта, так как это может побудить R вернуть память в операционную систему.
blockquote>Таким образом, ответ заключается в том, что полезно называть
gc()
(и, по крайней мере, не повредить), даже если он, вероятно, будет запущен в любом случае (если не сразу, то скоро).
Лично мне нравится включать gc()
в циклы, чтобы освободить некоторую ОЗУ, когда петли начнут заполнять доступное пространство. Что-то вроде
for(i in 1:1000){
res[[i]] = some operation
gc()
}
Замечание Re ThankGoat о gc-штрафе, в то время как это верно, можно было бы, конечно, принять решение называть gc каждые N итераций в цикле (где N можно параметризовать несколькими способами). Для циклов, где число итераций велико, но использование ресурсов в пределах заданной итерации более скромно, может не понадобиться делать GC каждую итерацию, чтобы восстановить желаемую производительность.
Конечно, если вы зацикливаетесь с очень большим количеством очень высоких итераций использования, это совсем другая история, но на этом этапе вполне может случиться, что код просто нуждается в векторизации и / или, возможно, даже написанном на другом языке.
gc()
позволяет избежать этого. Использование доступной памяти в порядке, излишней замены нет, поскольку это отрицательно влияет на удобство использования ОС. Современные GC справляются с этим намного лучше. – Konrad Rudolph 29 October 2015 в 16:54gc()
. – Paul 20 August 2017 в 12:37