【发布时间】:2012-12-14 02:37:30
【问题描述】:
我有一个 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(我知道字面上没有)这样的东西可以实现我想要的——迭代更新单个数据框——保存到文件中——使用追加而不是完全替换?
【问题讨论】:
-
好吧,我认为你一开始就做坏事。您正在覆盖以前的数据,从而有效地删除了以前的版本。也就是说,为什么不使用
write.table以文本形式(例如CSV)保存您的数据,这确实允许附加到现有文档? -
我实际上是用 rbind 到最新记录的先前数据的副本覆盖先前的数据。希望我的第二块展示了这个过程——读入旧的,追加新的,用旧的+新的覆盖旧的。我现在看到了 write.table 附加选项。我一直远离非原生格式,因为我认为它会增加处理开销。但我可能会接受在这一步中牺牲一点效率以获得更好的稳定性。
-
我想知道是否可以使用 ?serialize 的一些魔法来创建附加函数。