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

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

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

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

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

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

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

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

  • рабочий-для-статистического-анализа-и-написания отчета
  • приемы в управлении самой доступной-память-в-в-г-сессии

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Фиксирование порядка граней в ggplot
  • генерировать последовательность внутри группы в R
  • Могут ли быть созданы списки, основанные на именах входных объектов?
  • Как отключить научную нотацию?
  • Оценить выражение, данное как строка
  • Построение «логотипа последовательности» с использованием ggplot2?
  • Одновременно слияние нескольких кадров данных в списке
  • Разреженная matrix к кадру данных в R
  • Создание многострочной диаграммы для нескольких переменных - ggplot2 в R
  • R - список к кадру данных
  • Заменить значения в фрейме данных на основе таблицы поиска
  • Interesting Posts

    Android: использование линейного gradleиента в качестве фонового изображения

    Telnet не будет запускаться из приглашения cmd в Windows 7

    Скорость передачи данных на USB-накопитель, подключенный к Wi-Fi-маршрутизатору, очень медленная

    Установка пароля пользователя root root на OS X

    Зависимость от Maven для API Servlet 3.0?

    Является ли Haskell действительно чистым (есть ли какой-либо язык, который занимается вводом и выходом вне системы)?

    Как загрузить / проверить проект из Google Code в Windows?

    Разница между «Веб-сайтом» и «Проектом» в Visual Studio

    Вызов функции переопределения базового classа из метода базового classа

    Получить имена столбцов из java.sql.ResultSet

    FLOPS за цикл для песчаного моста и haswell SSE2 / AVX / AVX2

    Ошибка сегментации, большие массивы

    Как отступить в отладчике Eclipse?

    Excel VBA – функция QueryTable AfterRefresh, которая не вызывается после завершения обновления

    Каково максимальное количество разделов с EFI?

    Давайте будем гением компьютера.