Вызов saveRDS перед выполнением цикла приводит к несогласованной синхронизации цикла.Это видно только при использовании RStudio;проблема не существует при запуске того же сценария из командной строки с использованием Rscript.Это может быть результатом отложенного сброса ввода-вывода в RStudio.
- Заметили ли другие такое поведение?
- Есть ли способ принудительно сбросить ввод-вывод после вызова saveRDS??
Использование RStudio 1.1.463, R 3.5.2 в 64-битной Ubuntu 18.04LTS.
Я устранил сборщик мусора как проблему, вызвав gc () передвыполнение кода и включение gc-сообщений с помощью gcinfo, чтобы убедиться, что gc не запускается.Я также попытался предварительно скомпилировать функцию с помощью cmpfun;это тоже не поможет.
Следующий код может быть использован для воспроизведения проблемы.
loop.test <- function() {
t <- c()
t0 <- Sys.time()
for (i in 1:10) {
t <- c(t, Sys.time() - t0)
Sys.sleep(0.01)
}
dt <- round(1000 * diff(t), 1)
print(dt)
print(summary(dt))
}
saveRDS(1:10, 'garb.rds')
loop.test()
Код выдаст следующий вывод (время цикла в мс):
[1] 10.1 10.1 10.2 10.2 275.4 10.2 10.1 10.2 10.2
Min. 1st Qu. Median Mean 3rd Qu. Max.
10.10 10.10 10.20 39.63 10.20 275.40
Обратите внимание, что большая задержка не всегда будет появляться на одной и той же итерации.
Удаление вызова saveRDS в коде всегда приводит к согласованной (близкой к 10 мс) синхронизации цикла.
Запуск кода из командной строки через Rscript будет работать с и без строки saveRDS.