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

Должен ли я получить привычку удалять неиспользуемые переменные в R?

В настоящее время я работаю с относительно большими файлами данных, и мой компьютер не является суперкомпьютером. Я создаю много подмножеств этих наборов данных временно и не удаляю их из рабочей области. Очевидно, что они создают беспорядок многих переменных. Но есть ли эффект наличия множества неиспользуемых переменных при выполнении R? (то есть память компьютера заполняется в какой-то момент?)
При написании кода я должен начать привычку удалять неиспользуемые переменные? Стоит ли это?

x <- rnorm(1e8)
y <- mean(x)
# After this point I will not use x anymore, but I will use y
# Should I add following line to my code? or 
#   Maybe there will not be any performance lag if I skip the following line:
rm(x)

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

4b9b3361

Ответ 1

Да, неиспользуемые объекты будут влиять на вашу производительность, так как R хранит все свои объекты в памяти. Очевидно, что небольшие объекты будут иметь незначительное влияние, и вам в основном нужно удалить только очень большие (кадры данных с миллионами строк и т.д.), Но наличие незагроможденного рабочего пространства ничего не повредит.

Единственный риск - это удалить то, что вам нужно позже. Даже при использовании репо, как было предложено, случайное разбиение вещей - это то, чего вы хотите избежать.

Один из способов обойти эти проблемы - широко использовать local. Когда вы выполняете вычисление, которое рассеивает множество временных объектов, вы можете обернуть его внутри вызова local, который впоследствии будет эффективно удалять эти объекты для вас. Больше не нужно очищать партии i, j, x, temp.var и еще что-то.

local({
    x <- something
    for(i in seq_along(obj))
        temp <- some_unvectorised function(obj[[i]], x)
        for(j in 1:temp)
            temp2 <- some_other_unvectorised_function(temp, j)
    # x, i, j, temp, temp2 only exist for the duration of local(...)
})

Ответ 2

Добавляя к приведенным выше предложениям, чтобы помочь начинающим, таким как я, я хотел бы указать шаги для проверки памяти R:

  • Список объектов, которые не используются с помощью ls().
  • Проверьте интересующие объекты с помощью object.size("Object_name")
  • Удалить неиспользуемые/ненужные объекты с помощью rm("Object_name")
  • Используйте gc()
  • Очистить память с помощью memory.size()

В случае, если вы используете новый сеанс, используйте rm(list=ls()), а затем gc().

Если вы чувствуете, что привычка удалять неиспользуемые переменные может быть опасной, всегда полезно сохранять объекты в R-изображениях иногда.

Ответ 3

Я думаю, что это хорошая практика программирования для удаления неиспользуемого кода, независимо от языка.

Также рекомендуется использовать систему контроля версий, такую ​​как Subversion или Git, для отслеживания истории изменений. Если вы это сделаете, вы можете удалить код без страха, потому что всегда можно вернуться к более ранним версиям, если вам нужно.

Это фундаментальное для профессионального кодирования.