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

Принудительная сборка мусора для запуска в R с помощью команды gc()

Периодически я программирую небрежно. Хорошо, я программирую неряшливо все время, но иногда это догоняет меня в виде ошибок из памяти. Я начинаю выполнять небольшую дисциплину при удалении объектов с помощью команды rm(), и все становится лучше. Я вижу смешанные сообщения в Интернете о том, должен ли я явно вызывать gc() после удаления больших объектов данных. Некоторые говорят, что до того, как R вернет ошибку памяти, он будет запускать gc(), в то время как другие говорят, что ручное принуждение gc - хорошая идея.

Должен ли я запускать gc() после удаления больших объектов, чтобы обеспечить максимальную доступность памяти?

4b9b3361

Ответ 1

"Возможно." Я делаю это тоже, и часто даже в цикле, как в

cleanMem <- function(n=10) { for (i in 1:n) gc() }

Тем не менее, по моему опыту, восстановить память в первозданном состоянии.

Так что я обычно делаю, это держать задачи под рукой в ​​файлах script и выполнять их с использованием интерфейса r (в Unix и из пакета 'littler'). Rscript является альтернативой этой другой ОС.

Этот рабочий процесс согласуется с

который мы рассмотрели здесь раньше.

Ответ 2

На странице справки gc:

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

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

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

Другими словами, я имею в виду такие вещи, как

  1. Написание функций, а не сырых скриптов, поэтому переменные выходят за рамки.

  2. Опорожнение вашего рабочего пространства, если вы перейдете от одной проблемы к другой несвязанной.

  3. Отбрасывание данных/переменных, которые вас не интересуют. (Я часто получаю электронные таблицы с десятками неинтересных столбцов.)

Ответ 3

Немного поздно для вечеринки, но:

Явный вызов gc освободит некоторую память "сейчас".... так что если другим процессам нужна память, это может быть хорошей идеей. Например, перед вызовом system или аналогичным. Или, возможно, когда вы "закончите" с помощью script, а R будет сидеть без дела некоторое время, пока не придет следующее задание - снова, чтобы другие процессы получили больше памяти.

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

... но если вы хотите, например, измерить время, обычно рекомендуется сделать GC перед запуском теста. Это то, что по умолчанию system.time.

ОБНОВЛЕНИЕ. Как указывает @DWin, R (или С# или Java и т.д.) не всегда знают, когда память низкая, и GC необходимо запустить. Поэтому иногда вам может понадобиться сделать GC в качестве рабочего для недостатков в системе памяти.

Ответ 4

Предположительно R использует только ОЗУ. Это просто не соответствует действительности на Mac (и я подозреваю, что это не так и для Windows). Если в нем закончится ОЗУ, он начнет использовать виртуальную память. Иногда, но не всегда, процессы будут "распознавать", что им нужно запустить gc() и освободить память. Когда они этого не сделают, вы можете увидеть это, используя ActivityMonitor.app и увидев, что вся RAM занята, и доступ к диску вскочил. Я нахожу, что когда я делаю большие регрессионные прогоны Cox, которые я могу избежать, перейдя в виртуальную память (с медленным доступом к диску) предыдущими вызовами с помощью gc(); cph(...)

Ответ 5

Нет. Если для операции недостаточно памяти, R будет автоматически запускать gc().

Ответ 6

"Может быть." У меня нет окончательного ответа. Но файл справки предполагает, что на самом деле существует только две причины для вызова gc():

  • Вам нужен отчет об использовании памяти.
  • После удаления большого объекта "он может побудить R вернуть память в операционную систему".

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