2014-08-27 2 views
3

У меня есть основная функция в R, которая вызывает другие файлы для запуска моей программы. Я вызываю основной файл через файл bat (.exe). Когда я запускаю его по очереди, он работает без ошибки памяти, но когда я вызываю файл bat для его запуска, он останавливается и дает мне следующую ошибку:R: Невозможно выделить память больше, чем x MB

Невозможно выделить память более 51 МБ.

Как я могу избежать этого?

+0

Похоже, что вы используете 64-разрядную R при запуске его построчно и 32-битный R в пакетный файл. –

ответ

1

Да, вы должны использовать 64-битный R, если можете.

См. this question, и это от R docs.

2

Ограничения памяти в R, такие как это повторяющийся кошмар для многих из нас.

Очень часто проблема ограничение накладывается на ваши пределы ОС (которые обычно могут быть изменены в командной строке Bash или PowerShell), архитектура (32 против 64 бит) или наличия смежных бесплатно RAM, независимо от общей доступной памяти.

Трудно сказать, почему что-то не вызовет проблемы с памятью при запуске по строкам, но будет поражать предел памяти при запуске в качестве .bat.

Какая версия R вы используете? У вас оба установлены? Является ли 32-битный вызов Rscript при запуске вашего .bat-файла, тогда как вы запускаете 64-разрядную версию по очереди? Вы можете проверить версию R, которая запускается с R.Version().

Вы можете проверить это, выполнив команду memory.limit() как на вашем R IDE/терминале, так и в вашем .bat-файле (обязательно укажите print или сохраните результат как объект в вашем .bat-файле). Вам также может потребоваться установить memory.limit() в ваш .bat-файл, поскольку он может иметь меньший размер по умолчанию, возможно, из-за различий в вашем профиле R, который вызывается в вашей среде IDE или терминале в сравнении с файлом .bat.

Если архитектура не причина вашей ошибки памяти, то у вас есть несколько шагов по устранению неполадок более попробовать: использование памяти

  1. Проверьте в обеих средах (в R непосредственно и через ваш процесс .bat) с помощью этого: sort(sapply(ls(),function(x){object.size(get(x))}))
  2. Запуск сборщика мусора явно в сценариях, это gc() команду
  3. Проверьте все размеры объектов, чтобы убедиться, нет никаких неожиданных результатов в вашем процессе .bat: sort(sapply(ls(),function(x){format(object.size(get(x)), units = "Mb")}))
  4. профилирование Try памяти:

    Rprof(tf <- "rprof.log", memory.profiling=TRUE) 
    Rprof(NULL) 
    summaryRprof(tf) 
    
  5. Хотя это вопрос RAM, для хорошей меры вы можете проверить, что мощность вычислений доступна как достаточно и не варьируя между этими двумя способами запуска вашим код: parallel::detectCores()

  6. Изучите свое выступление с проф.lineprof инструмент Hadley Wikham в (предупреждение: требуется devtools и не работает на строк кода, которые требуют языка программирования C)

    Ссылки Пока я тяну эти фрагменты из моего собственного кода, большинство из них изначально пришли от других смежных должностей StackOverflow, таких как:

    1. Reaching memory allocation in R
    2. R Memory Allocation "Error: cannot allocate vector of size 75.1 Mb"
    3. R memory limit warning vs "unable to allocate..."
    4. How to compute the size of the allocated memory for a general type
    5. R : Any other solution to "cannot allocate vector size n mb" in R?
Смежные вопросы