7

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

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

在第二次...第 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

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

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

4

2 回答 2

5

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

con <- file("tmp.rds")
open(con)
df <- readRDS(con)
df.new <- rbind(df,df)
saveRDS(df.new, con)
close(con) 

更新:

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

while(is.Open(con)) { # untested but something of this nature should work
sys.Sleep(2)
}
于 2012-12-28T23:22:41.367 回答
1

在目录中使用一系列编号的 RDS 文件而不是单个 RDS 文件有什么问题吗?我认为不可能在不重写整个文件的情况下将 RDS 文件附加到数据帧,因为数据帧只是列的列表,所以大概它们一次序列化一列,所以只有最后一列结束文件末尾附近。

如果您想坚持使用单个文件但尽量减少从 RDS 文件中读取不一致数据的风险,您可以将其读入,执行附加操作,然后将其写入临时文件并将临时文件重命名为原始文件完成后命名。那么至少您的风险期不取决于文件的大小。我不熟悉将文件重命名为现有名称时各种文件系统保证什么样的原子性,但它可能比 saveRDS 所花费的时间要好。

于 2012-12-29T00:27:40.897 回答