Подтвердить что ты не робот

Мониторинг изменений файлов (файлов) в реальном времени

У меня есть программа, которая контролирует определенные файлы для изменения. Как только файл будет обновлен, файл будет обработан. До сих пор я придумал этот общий подход к передаче "анализа в реальном времени" в Р. Я надеялся, что у вас есть другие подходы. Возможно, мы можем обсудить их преимущества/недостатки.

monitor <- TRUE
start.state <- file.info$mtime # modification time of the file when initiating

while(monitor) {
  change.state <- file.info$mtime
  if(start.state < change.state) {
    #process
  } else {
    print("Nothing new.")
  }
  Sys.sleep(sleep.time)
}
4b9b3361

Ответ 1

Подобно предложению использовать системный API, это можно сделать также с помощью qtbase (https://r-forge.r-project.org/R/?group_id=454), который будет межплатформенным средством изнутри R:

dir_to_watch <- "/tmp"

library(qtbase)
fsw <- Qt$QFileSystemWatcher()
fsw$addPath(dir_to_watch)

id <- qconnect(fsw, "directoryChanged", function(path) {
  message(sprintf("directory %s has changed", path))
})

cat("abc", file="/tmp/deleteme.txt")

Ответ 2

Если ваша система предоставляет API для мониторинга изменений файловой системы, вы должны использовать это. Я считаю, что Macs с этим. Однако не уверены в других платформах.

Изменить: Быстрый гуг дал мне:

Linux - http://wiki.linuxquestions.org/wiki/FAM

Win32 - http://msdn.microsoft.com/en-us/library/aa364417(VS.85).aspx

Очевидно, что эти API исключат любой требуемый опрос. С другой стороны, они могут быть не всегда доступны.

Java имеет это: http://jnotify.sourceforge.net/ и http://java.sun.com/developer/technicalArticles/javase/nio/#6

Ответ 3

У меня есть взлома: вы можете настроить задание CRON/Запланированное задание для запуска R script каждые n секунд (или что-то еще). R script проверяет хэш файла, и если хеши не совпадают, выполняется анализ. Вы можете использовать функцию digest::digest, просто ознакомьтесь с руководством.

Ответ 4

Если у вас есть много файлов, которые вы хотите контролировать, R может быть слишком медленным для этой цели. Перейдите в каталог c: или / и посмотрите, сколько времени потребуется на выполнение file.info(dir(recursive = TRUE)). Дозы или bash script могут быть быстрее.

В противном случае код выглядит нормально.

Ответ 5

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