我有一个程序,监视某些文件的更改。文件更新后,即会对其进行处理。到目前为止,我已经提出了在R中处理“实时分析”的一般方法。我希望你们还有其他方法。也许我们可以讨论它们的优缺点。
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)
}
类似于使用系统API的建议,也可以使用qtbase来完成,这将是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")
如果您的系统提供了用于监视文件系统更改的API,则应使用该API。我相信Mac会附带这个。但是不确定其他平台。
编辑:快速搜索给了我:
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
我有一个主意:您可以设置CRON作业/计划任务以每n秒(或任何其他时间)运行R脚本。 R脚本检查文件哈希,如果哈希不匹配,则运行分析。您可以使用digest::digest
功能,只需查看手册即可。
如果您要监视的文件很多,那么R可能太慢了。转到您的c:
或/
目录,查看执行file.info(dir(recursive = TRUE))
需要多长时间。使用dos或bash脚本可能会更快。
否则,代码看起来不错。
您可以使用tcltk2软件包中的tclTaskSchedule函数来设置一个检查更新并运行代码的函数。然后,它将定期运行(您设置时间),但仍然允许您使用R会话。