Я периодически чищу память в R, используя вызов rm(list=ls())
.
Нужно ли мне после этого называть сборщик мусора gc()
?
В чем разница между этими двумя функциями? Вызывает ли gc()
вызов rm()
для определенных переменных?
Я периодически чищу память в R, используя вызов rm(list=ls())
.
Нужно ли мне после этого называть сборщик мусора gc()
?
В чем разница между этими двумя функциями? Вызывает ли gc()
вызов rm()
для определенных переменных?
Во-первых, важно отметить, что они отличаются друг от друга тем, что gc
не удаляет любые переменные, которые вы все еще используете, - только освобождает память для тех, к которым у вас больше нет доступа (удалено ли используя rm()
или, скажем, создан в функции, которая с тех пор вернулась). Запуск gc()
никогда не заставит вас потерять переменные.
Вопрос о том, следует ли вызывать gc()
после вызова rm()
, тем не менее, является хорошим. документация для gc помогает:
Вызов gc вызывает сбор мусора. Это также будет происходить автоматически без вмешательства пользователя, и основной целью вызова gc является отчет об использовании памяти.
Однако может быть полезно вызвать gc после удаления большого объекта, поскольку это может побудить R вернуть память в операционную систему.
Таким образом, ответ заключается в том, что может быть хорошо называть gc()
(и, по крайней мере, не может повредить), хотя он, вероятно, будет запущен в любом случае (если не сразу, а затем скоро).
Лично мне нравится включать циклы gc()
для освобождения некоторой ОЗУ, когда петли начинают заполнять доступное пространство. Что-то вроде
for(i in 1:1000){
res[[i]] = some operation
gc()
}
Re ThankGoat комментировать gc штраф, в то время как это правда, можно было бы, конечно, принять решение называть gc каждые N итераций в цикле (где N можно параметризовать несколькими способами). Для циклов, где число итераций велико, но использование ресурсов в рамках данной итерации является более скромным, вполне возможно, что не нужно делать GC каждую итерацию, чтобы восстановить желаемую производительность.
Конечно, если вы зацикливаетесь с очень большим количеством очень высоких итераций использования, это совсем другая история, но на этом этапе вполне может случиться, что код просто нужно прорисовать и/или, возможно, даже записать на другом языке,