В чем разница между gc () и rm () - PullRequest
55 голосов
/ 11 января 2012

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

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

Ответы [ 3 ]

72 голосов
/ 11 января 2012

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

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

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

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

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

0 голосов
/ 17 августа 2018

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

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

0 голосов
/ 07 сентября 2017

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

for(i in 1:1000){
res[[i]] = some operation
gc()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...