Я бегу моделирования на 64-битную Windows-компьютер с 64 ГБ ОЗУ. Использование памяти достигает 55% и после того, как готовый моделирования я удалить все объекты в рабочем пространстве по РМ(список=ЛС()), затем
двойной ГК()`.
Я предполагал, что это освободит достаточно памяти для следующего прогона моделирования, но на самом деле использование памяти падает всего на 1%. Консультирование множество разных форумах, я не мог найти удовлетворительного объяснения, только расплывчатые комментарии, такие как:
и gt;"и в зависимости от вашей операционной системы, освободил память не может быть возвращена операционной системы, но сохранил в пространстве процесса.&ьquot;
Я'd, как найти информацию о:
"Р" сборщик мусора несовершенна в следующем (не так) тонкий способ: это не перемещать объекты (т. е. не компактный память) то, каким образом она взаимодействует с библиотеки
. (Некоторые другие языки/реализации страдать от этого тоже, но другие, несмотря на также взаимодействия с C
, то успею сжатие генеративная GC, который не страдают от этой проблемы).
Это означает, что если вы по очереди выделяя небольшие куски памяти, которые затем отбрасываются, а более крупные куски для более постоянными объектами (это обычная ситуация, когда делаешь строка/регулярное выражение обработки), тогда ваша память будет фрагментированных и сборщик мусора не может сделать ничего об этом: память освобождается, но не могут быть повторно использованы, потому что кусочки слишком короткие.
Единственный способ исправить проблему-сохранить объекты, которые вы хотите, перезапустите "Р", и перезагрузить объектов.
Поскольку вы делаете РМ(список=ЛС())`, т. е. вам не нужны никакие предметы, вам не нужно сохранить и перезагрузить ничего, так, в вашем случае, решение-это именно то, что вы хотите избежать перезагрузки "Р".
ПС. Сборка мусора-это весьма нетривиальная тема. Е. Г., Рубин 5 (!) различные алгоритмы сборки мусора более 20 years. В Java GC не сосать, потому что Sun/Oracle и ИБМ потратил многих программист-лет на их реализаций ГК. С другой стороны, R и Python паршивые ГХ - потому что никто не мешал вкладывать необходимые человеко-лет - и они довольно популярны. Что'ы хуже-лучше для вас.
ППС. Связанные: https://stackoverflow.com/q/17660202/850781
Как проверить использование памяти? Как правило, виртуальная машина выделяет некоторый кусок памяти, который он использует для хранения своих данных. Некоторые из выделенных неиспользуемые и помечается как свободное. Что ГК не открывает данные, которые не указаны нигде и обозначение соответствующими блоками памяти, неиспользованный, это не значит, что эта память выделяется для операционной системы. Еще с точки зрения ВМ там's теперь больше свободной памяти, которая может быть использована для дальнейших расчетов.
Как другие просили вы испытываете из-за ошибок памяти? Если нет, то там's ничего, чтобы волноваться.
Редактировать: Этот и этот должно быть достаточно, чтобы понять, как выделение памяти и сборка мусора работает в р.
Из первого документа:
иногда делается попытка освободить неиспользуемые страницы назад операционная система. Когда выйдет страниц, количество свободных узлов равный R_MaxKeepFrac раза число выделенных узлов для каждого класс сохраняется. Страницы не требуется для удовлетворения этого требования выпущено. Попытка освобождения страниц производится каждый уровень R_PageReleaseFreq 1 или 2 коллекции.
EDIT2:
Чтобы увидеть используемой памяти попробуйте запустить ГХ() с подробной значение true:
gc(verbose=T)
Здесь'ы результат с массивом 10'000'000 целые числа в памяти:
Garbage collection 9 = 1+0+8 (level 2) ...
10.7 Mbytes of cons cells used (49%)
40.6 Mbytes of vectors used (72%)
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 198838 10.7 407500 21.8 350000 18.7
Vcells 5311050 40.6 7421749 56.7 5311504 40.6
И здесь's после отбрасывания ссылку на него:
Garbage collection 10 = 1+0+9 (level 2) ...
10.7 Mbytes of cons cells used (49%)
2.4 Mbytes of vectors used (5%)
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 198821 10.7 407500 21.8 350000 18.7
Vcells 310987 2.4 5937399 45.3 5311504 40.6
Как вы можете видеть памяти, используемой Vcells снизилась с 40,6 Мб до 2,4 Мб.