实时监控文件变化

17

我有一个程序,它监视某些文件的更改。一旦文件被更新,该文件就会被处理。到目前为止,我已经想出了这种在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)
}

一般来说,这样做或许没问题,但它会占用 R 事件循环,直到你杀掉 while 循环。比如说,它不会在后台运行,让你可以继续工作。如果你可以让这个进程持续运行,那么这没什么问题,但我喜欢下面提供的 cron 作业 RScript 答案。 - Gavin Simpson
2
你能否在更新文件的任何地方不调用运行 R 脚本的函数吗? - James
@James,这可能是可行的,但我需要检查一下。 - Roman Luštrik
2
值得一提的是:?utils::changedFiles - ismirsehregal
6个回答

7

类似于使用系统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")

由于该软件包不再得到维护,因此被投下了反对票,因此这个回答的现值有限,尽管在过去的某个时候可能很有用。 - James Crumpler

7
我有一个想法:您可以设置一个CRON作业/计划任务,每隔n秒(或其他时间)运行R脚本。 R脚本会检查文件哈希值,如果哈希值不匹配,则运行分析。您可以使用digest::digest函数,详见手册。

1
aL3xa - 你能详细阐述一下这个流程的细节和你得到这个想法的来源吗?我认为这会更符合我的流程,但很难知道你使用digest包的意思。 - James Crumpler

6

如果您的系统提供了监视文件系统更改的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


4
在Linux上,gamininotify可以实现这一功能。http://www.noah.org/wiki/FAM,_Gamin,_inotify - aL3xa
这些看起来更新,支持也更好。谢谢 aL3xa。 - jetru
1
git status --porcelain 还会检查哈希值以查看哪些文件已更改,并以可由脚本解析的形式输出。但您需要设置这些文件以便被 Git 跟踪。 - Richie Cotton

3
如果您有大量要监控的文件,则R可能对此目的太慢了。转到您的c:/目录,查看执行file.info(dir(递归= TRUE))需要多长时间。DOS或BASH脚本可能更快。否则,代码看起来很好。

我总是想着R语言,这就是问题所在... =) Bash脚本可以检查文件哈希值,如果需要的话运行R脚本。这绝对是一个更好的解决方案。 - aL3xa
我将只监控几个文件。 - Roman Luštrik

3
你可以使用tcltk2包中的tclTaskSchedule函数来设置一个检查更新并运行代码的函数。这将定期运行(你可以设置时间),但仍然允许你使用R会话。

0
我将为Windows提供另一种解决方案,这是我在生产环境中一直在使用的,它完美地工作,并且我发现非常容易设置。在幕后,它基本上访问系统API以监视文件夹更改,就像其他人提到的那样,但所有的“艰苦工作”都已经为您处理好了。我使用一个名为Folder Monitor的免费软件,可以在Nodesoft此处找到详细描述。一旦您执行此程序,它将出现在系统托盘中,从那里您可以指定要监视的目录。当文件被写入目录(或更改或修改-有几个选项可供选择)时,该程序会执行任何您喜欢的程序。我只需将程序链接到调用我的R脚本的Windows批处理文件中。例如,我已经设置Folder Monitor来监视"\myservername\DropOff" UNC路径,以查看是否有新的数据文件被写入其中。当Folder Monitor检测到新文件时,它会执行RunBatch.bat文件,该文件简单地运行一个R脚本(有关设置信息,请参见此处),该脚本根据接收到的文件的预期命名约定验证所期望的文件格式,然后解压缩并处理数据,创建数据框架,最终将其加载到SQL Server数据库中。这再也没有更简单的了。
如果您决定使用此解决方案,请注意可选的延迟执行参数,如果从源位置复制文件到目标目录需要一段时间,则可能非常重要。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接