我有一个监控某些文件以进行更改的程序。文件一旦更新,就会处理该文件。到目前为止,我已经提出了在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)
}
答案 0 :(得分: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")
答案 1 :(得分:6)
如果您的系统提供用于监视文件系统更改的API,那么您应该使用它。我相信Mac有这个。但不确定其他平台。
编辑: 一个快速的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
答案 2 :(得分:6)
我有一个黑客的想法:你可以设置一个CRON作业/计划任务,每隔 n 秒(或其他)运行R脚本。 R脚本检查文件哈希值,如果哈希值不匹配,则运行分析。您可以使用digest::digest
功能,只需查看手册。
答案 3 :(得分:3)
如果您要监视许多文件,则R可能太慢而无法实现此目的。转到c:
或/
目录,看看file.info(dir(recursive = TRUE))
需要多长时间。 dos或bash脚本可能更快。
否则,代码看起来很好。
答案 4 :(得分:3)
您可以使用tcltk2包中的tclTaskSchedule函数来设置检查更新并运行代码的函数。然后这将定期运行(您设置时间),但仍然允许您使用R会话。
答案 5 :(得分:0)
我将为我在生产环境中使用的 Windows 提供另一种解决方案,该解决方案运行良好,而且我发现它非常易于设置,并且在后台,它基本上像其他人一样访问系统 API 以监视文件夹更改提到了,但所有的“辛勤工作”都为您处理。我使用了 Nodesoft 提供的一款免费软件,名为 Folder Monitor,并且对 here 进行了很好的描述。执行此程序后,它会出现在您的系统托盘中,您可以从那里指定要监视的给定目录。当文件写入目录(或更改或修改 - 有几个选项可供您选择)时,程序会执行您喜欢的任何程序。我只是将程序链接到调用我的 R 脚本的 Windows 批处理。例如,我将文件夹监视器设置为监视写入其中的任何新数据文件的“\myservername\DropOff”UNC 路径。当文件夹监视器检测到新文件时,它会执行 RunBatch.bat 文件,该文件仅运行一个 R 脚本(有关设置的信息,请参阅 here),该脚本根据接收到的文件的预期命名约定验证预期文件的格式然后解压缩并处理数据,创建一个数据框并最终将其加载到 SQL Server 数据库中。它只是没有变得更容易。
如果您决定使用此解决方案,请注意:查看可选的延迟执行参数,如果文件需要一段时间才能从源位置复制到目标目录,这可能很重要。