Мониторинг изменений файлов (файлов) в реальном времени
У меня есть программа, которая контролирует определенные файлы для изменения. Как только файл будет обновлен, файл будет обработан. До сих пор я придумал этот общий подход к передаче "анализа в реальном времени" в Р. Я надеялся, что у вас есть другие подходы. Возможно, мы можем обсудить их преимущества/недостатки.
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)
}
Ответы
Ответ 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.