将新数据附加到R中的现有数据帧(RDS)

Amw*_* 5G 6 r append stream dataframe

我有一个Rscript,它以平面文件的形式读取恒定的数据流.另一个脚本获取此平面文件,进行一些解析和处理,然后将结果保存为RDS格式的data.frame.然后它睡觉,并重复这个过程.

saveRDS(tmp.df, file="H:/Documents/tweet.df.rds") #saving the data.frame
Run Code Online (Sandbox Code Playgroud)

在第二次...第n次迭代中,我让代码只处理自上一次迭代以来添加到平面文件的新行.但是,为了将增量线附加到永久数据帧,我必须将其读入,追加,然后将其保存回来,覆盖原始数据.

df2 <- readRDS("H:/Documents/tweet.df.rds") #read in permanent                      
tmp.df2 <- rbind(df2, tmp.df) #append new to existing
saveRDS(tmp.df2, file="H:/Documents/tweet.df.rds") #save it
rm(df2) #housecleaning
rm(tmp.df2) #housecleaning
Run Code Online (Sandbox Code Playgroud)

这种方法存在风险,因为每当RDS打开读/写时,另一个想要触摸该文件的进程必须等待.随着基础文件变大,风险也会增加.

是否存在类似appendRDS(我知道字面上没有)的东西可以实现我想要的东西 - 迭代更新单个数据框 - 保存到文件 - 使用附加而不是完全替换?

Bra*_*sen 5

我认为您可以通过在下一个流程接管之前使用连接、打开和关闭它来保护您的流程。

con <- file("tmp.rds")
open(con)
df <- readRDS(con)
df.new <- rbind(df,df)
saveRDS(df.new, con)
close(con) 
Run Code Online (Sandbox Code Playgroud)

更新:

您可以测试与文件的连接是否已打开,并在遇到并发问题时告诉它稍等片刻。

while(is.Open(con)) { # untested but something of this nature should work
sys.Sleep(2)
}
Run Code Online (Sandbox Code Playgroud)