Замена большого объекта в R освобождает память? [Дубликат]

Просто измените функцию:

def notastonishinganymore(a = []): '''The name is just a joke :)'''
    a = a[:]
    a.append(5)
    return a
45
задан Seb 11 January 2012 в 09:10
поделиться

3 ответа

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

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

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

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

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

62
ответ дан Seb 21 August 2018 в 11:15
поделиться
  • 1
    Спасибо за ваш ответ. Вообще говоря, сборка мусора R считается хорошей? (такой же надежный, как, например, java) – RockScience 11 January 2012 в 05:51
  • 2
    Это трудный вопрос для ответа, я не уверен. Этот вопрос полезен. – David Robinson 11 January 2012 в 06:52
  • 3
    Обычно вам не нужно называть gc, и вряд ли это будет иметь большое значение, если вы это сделаете. – hadley 11 January 2012 в 15:20
  • 4
    @hadley Это не соответствует моему опыту. Напротив, R часто приводит к тому, что моя операционная система меняет местами даже после того, как большие объекты (~ несколько сотен MiB) больше недоступны. Однако ручное вызов gc() позволяет избежать этого. Использование доступной памяти в порядке, излишней замены нет, поскольку это отрицательно влияет на удобство использования ОС. Современные GC справляются с этим намного лучше. – Konrad Rudolph 29 October 2015 в 16:54
  • 5
    Комментарий Seconding @ KonradRudolph - в недавней работе я замечал огромное количество памяти, потребляемой локальными переменными функции. Память не освобождается, когда переменные выходят за рамки, как это было бы на других языках. Мне пришлось называть gc(). – Paul 20 August 2017 в 12:37

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

for(i in 1:1000){
res[[i]] = some operation
gc()
}
-2
ответ дан Gabriel123 21 August 2018 в 11:15
поделиться
  • 1
    Помните, что для вызова gc () прилагается штраф за производительность в размере 100 мс за звонок. Так что в этом случае ваш код будет работать на 100 секунд дольше, чем нужно :) – ThankGoat 24 November 2017 в 09:39

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

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

0
ответ дан Pascoe 21 August 2018 в 11:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: