Проблема синхронизации, связанная с использованием saveRDS в RStudio - PullRequest
1 голос
/ 01 апреля 2019

Вызов 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.

1 Ответ

0 голосов
/ 05 апреля 2019

Вот ответ ребят из RStudio:

Одна возможность: RStudio выполняет некоторую фоновую работу во время R "простоя" (т. Е. Когда R вызывает R_ProcessEvents), и я думаю, что индексация файла проекта является одной из таких вещей. RStudio регистрирует файловые мониторы для этих задач, поэтому создание файла может привести к тому, что RStudio выполнит некоторую работу по переиндексации за кулисами.

Я проверил, что изменение каталога сохранения в вызове saveRDS () за пределы каталога проекта устраняет проблему с синхронизацией. Так что я думаю, что это поддерживает теорию индексации файлов. Предварительный просмотр RStudio v1.2 демонстрирует это поведение в меньшей степени, поэтому что-то могло измениться в реализации обработки в режиме ожидания, но у меня нет дополнительной информации по этому поводу. Для решения этой проблемы ребята из RStudio открыли отчет об ошибках, поэтому, надеюсь, исправление будет доступно в ближайшее время.

Итак, сейчас некоторые обходные пути для этого будут:

  1. Выполните вызов Sys.sleep () с достаточной задержкой после вызова saveRDS (), чтобы выполнить операцию переиндексации.
  2. Укажите saveRDS () на файл за пределами каталога текущего проекта, чтобы предотвратить повторную индексацию.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...