Как перезапустить R и продолжить тест сценария из предыдущей строки (в Windows)? - PullRequest
0 голосов
/ 13 мая 2019

Я хочу сравнить время и память профиля, используемую несколькими функциями (регрессия со случайными эффектами и другой анализ), примененными к различным размерам набора данных. Мой компьютер имеет 16 ГБ ОЗУ, и я хочу посмотреть, как R ведет себя с большими наборами данных и каков предел.

Для этого я использовал петлю и пакет bench .

После каждой итерации я очищаю память с помощью gc (reset = TRUE).
Но когда набор данных очень большой, сборщик мусора не работает должным образом, он просто освобождает часть памяти.
В конце все память остается заполненной, и мне нужно перезапустить сеанс R.

Мой полный набор данных называется allDT, и я делаю что-то вроде этого:

for (NN in (1:10)*100000)  {
    gc(reset=TRUE)  
    myDT <- allDT[sample(.N,NN)]
    assign(paste0("time",NN), mark( 
      model1 = glmer(Out~var1+var2+var3+(1|City/ID),data=myDT),
      model2 = glmer(Out~var1+var2+var3+(1|ID),data=myDT),
    iterations = 1, check=F))
}

Таким образом, я могу получить результаты для каждого размера.

Метод несправедлив, потому что в конце память не очищается должным образом.

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

Есть ли простой способ сделать это или альтернатива? Может быть, мне нужно каждый раз сохранять результаты на диск, но будет сложно отследить последнюю выполненную строку, особенно если R зависает. Мне может понадобиться создать внешний пакетный файл и запускать цикл, вызывая R на каждой итерации. Хотя я предпочитаю делать все из R без каких-либо внешних скриптов / пакетов.

1 Ответ

2 голосов
/ 13 мая 2019

Одна вещь, которую я делаю для таких тестов, - это запустить другой экземпляр R и заставить этот другой экземпляр R возвращать результаты в стандартный вывод (или, проще, просто сохранить его в виде файла).

Пример:

times <- c()
for( i in 1:length(param) ) {
   system(sprintf("Rscript functions/mytest.r %s", param[i]))
   times[i] <- readRDS("/tmp/temp.rds")
}

В файле mytest.r считайте параметры и сохраните результаты в файл.

args <- commandArgs(trailingOnly=TRUE)
NN <- args[1]
allDT <- readRDS("mydata.rds")
...
# save results
saveRDS(myresult, file="/tmp/temp.rds")
...