2011-01-24 2 views
16

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

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) 
} 
+0

В общем, это может быть хорошо, но он запустит цикл событий R, пока вы не убьете цикл while. Он не будет работать в фоновом режиме, например, позволяя вам работать с работой. Это нормально, если вы можете оставить процесс запущенным, но мне нравится ответ RScript на работу cron, указанный ниже. –

+2

Не можете ли вы вызвать вызов для запуска сценария R во всем, что обновляет файл? – James

+0

@James, это может быть выполнимо, но мне нужно будет проверить. –

ответ

7

Как и в случае с использованием системного 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") 
6

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

Edit: Быстрый GOOG дал мне:

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

+4

В Linux, 'gamin' и' inotify' могут сделать трюк. http://www.noah.org/wiki/FAM,_Gamin,_inotify – aL3xa

+0

Они кажутся более новыми и лучше поддерживаются. Спасибо aL3xa. – jetru

+1

'git status --porcelain' также проверяет хэши, чтобы увидеть, какие файлы были изменены, с выходом в форме, которая обрабатывается скриптами. Вам нужно будет настроить файлы, чтобы их отслеживали git. –

6

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

3

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

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

+0

У меня всегда есть R, вот в чем проблема ... =) Сценарий Bash может проверить хэш файла и запустить R-скрипт, если это необходимо. Это определенно лучшее решение. – aL3xa

+0

Я буду следить только за несколькими файлами. –

3

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

Смежные вопросы