Подтвердить что ты не робот

В чем разница между gc() и rm()

Я периодически чищу память в R, используя вызов rm(list=ls()).
Нужно ли мне после этого называть сборщик мусора gc()?

В чем разница между этими двумя функциями? Вызывает ли gc() вызов rm() для определенных переменных?

4b9b3361

Ответ 1

Во-первых, важно отметить, что они отличаются друг от друга тем, что gc не удаляет любые переменные, которые вы все еще используете, - только освобождает память для тех, к которым у вас больше нет доступа (удалено ли используя rm() или, скажем, создан в функции, которая с тех пор вернулась). Запуск gc() никогда не заставит вас потерять переменные.

Вопрос о том, следует ли вызывать gc() после вызова rm(), тем не менее, является хорошим. документация для gc помогает:

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

Однако может быть полезно вызвать gc после удаления большого объекта, поскольку это может побудить R вернуть память в операционную систему.

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

Ответ 2

Лично мне нравится включать циклы gc() для освобождения некоторой ОЗУ, когда петли начинают заполнять доступное пространство. Что-то вроде

for(i in 1:1000){
res[[i]] = some operation
gc()
}

Ответ 3

Re ThankGoat комментировать gc штраф, в то время как это правда, можно было бы, конечно, принять решение называть gc каждые N итераций в цикле (где N можно параметризовать несколькими способами). Для циклов, где число итераций велико, но использование ресурсов в рамках данной итерации является более скромным, вполне возможно, что не нужно делать GC каждую итерацию, чтобы восстановить желаемую производительность.

Конечно, если вы зацикливаетесь с очень большим количеством очень высоких итераций использования, это совсем другая история, но на этом этапе вполне может случиться, что код просто нужно прорисовать и/или, возможно, даже записать на другом языке,