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


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

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

6 58

6 ответов:

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

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

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

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

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

который мы изучили здесь.

со страницы справки на gc:

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

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

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

под всем остальным я подразумеваю такие вещи, как

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

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

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

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

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

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

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

обновление как указывает @DWin, R (или C#, или Java и т. д.) Не всегда знает, когда память низкая, и GC должен работать. Поэтому иногда вам может понадобиться сделать GC в качестве обходного пути для недостатков в системе памяти.

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

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

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

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

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