2011-01-24 25 views
16

Tengo un programa que supervisa ciertos archivos para el cambio. Tan pronto como el archivo se actualiza, el archivo se procesa. Hasta ahora, he llegado a este enfoque general de entregar "análisis en tiempo real" en R. Esperaba que ustedes tengan otros enfoques. Tal vez podamos discutir sus ventajas/desventajas.monitoreo de cambios en los archivos en tiempo real

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

En general, esto podría estar bien, pero enganchará el bucle de evento R hasta que elimine el bucle while. No se ejecutará en segundo plano, por ejemplo, lo que le permitirá continuar con el trabajo. Lo cual está bien si puede dejar el proceso en ejecución, pero me gusta la respuesta RScript del trabajo cron que se proporciona a continuación. –

+2

¿No puedes poner una llamada para ejecutar el script R en lo que esté actualizando el archivo? – James

+0

@James, eso puede ser factible, pero tendré que verificarlo. –

Respuesta

7

Similar a la sugerencia de usar una API de sistema, esto también se puede hacer usando qtbase (https://r-forge.r-project.org/R/?group_id=454) que será una plataforma multiplataforma. significa desde dentro 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

Si su sistema proporciona una API para supervisar los cambios del sistema de archivos, entonces debe usar eso. Creo que los Macs vienen con esto. Sin embargo, no estoy seguro acerca de otras plataformas.

Editar: Un GOOG rápida me dio:

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

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

Obviamente, estas API eliminará cualquier sondeo que usted requiere. Por otro lado, es posible que no siempre estén disponibles.

Java tiene esto: http://jnotify.sourceforge.net/ y http://java.sun.com/developer/technicalArticles/javase/nio/#6

+4

En Linux, 'gamin' y' inotify' pueden hacer el truco. http://www.noah.org/wiki/FAM,_Gamin,_inotify – aL3xa

+0

Estos parecen más nuevos y mejor compatibles. Gracias aL3xa. – jetru

+1

'git status --porcelain' también comprueba los hashes para ver qué archivos se han cambiado, con un resultado que se puede analizar mediante scripts. Tendrás que configurar los archivos para que sean rastreados por git sin embargo. –

6

tengo un corte en cuenta: se puede configurar un/Tarea programada trabajo cron para ejecutar secuencias de comandos R cada n segundo (o lo que sea). La secuencia de comandos R comprueba el hash del archivo y, si los hashes no coinciden, ejecuta el análisis. Puede usar la función digest::digest, solo consulte el manual.

3

Si tiene muchos archivos que desea controlar, entonces R puede ser demasiado lento para este propósito. Vaya a su c: o / dir y vea cuánto tiempo lleva hacer file.info(dir(recursive = TRUE)). Un script dos o bash puede ser más rápido.

De lo contrario, el código se ve bien.

+0

Siempre tengo en cuenta a R, ese es el problema ... =) El script Bash puede verificar el hash del archivo y ejecutar el script R si es necesario. Esa es definitivamente una mejor solución. – aL3xa

+0

Voy a controlar solo un par de archivos. –

3

usted podría utilizar la función tclTaskSchedule en el paquete tcltk2 para configurar una función que comprueba si hay actualizaciones y se ejecuta el código. Esto luego se ejecutará de forma regular (establezca el tiempo) pero aún le permitirá usar su sesión R.

Cuestiones relacionadas