我有300+ .rds文件,每个文件都有相同的列名,我想把它们绑定到一个压缩的.rds文件中,我可以通过sftp进行传输。
有没有一种方法可以在不将它们读入内存的情况下有效地完成这项工作?
目前,我正在使用以下代码,但这会在写入文件之前耗尽内存。任何想法都是非常感谢的。
library(tidyverse)
library(data.table)
df <- list.files(pattern = ".rds") %>%
map(readRDS) %>%
data.table::rbindlist()
saveRDS(df,"df.rds")最后,我逐个读入,并使用read::write_csv("name.csv",append=TRUE)将它们追加到磁盘上。之后,我使用{disk.frame}或SQL数据库来处理数据。
发布于 2020-12-16 07:32:59
正如其他人所评论的,追加/合并.rds文件可能是不可能的(或者至少是非常困难的)。但是,如果它们是简单的列,那么将它们转换为.csv应该是有问题的。在这种情况下,可以附加它们,假设(正如您所说的)它们具有匹配的列名。
这段代码从.rds文件名列表中读取,并将它们的数据附加到.csv。我几乎没有R经验,所以我不确定底层资源是如何管理的,但原则上这种方法应该允许您一次只读取一个文件,从而在构建大约300 1GB的.csv时将内存消耗保持在大约1 1GB。
fileNames <- list('test-one.rds', 'test-two.rds')
for (fileName in fileNames)
{
rds <- readRDS(fileName)
for (row in rds){
write(row, file = 'out.csv', append = TRUE)
}
}发布于 2020-12-16 14:36:22
如果您的最终目的是传输数据,请在sql server中读取和写入数据。
您可以将.rds转换为.csv,并使用HeidiSQL将其快速导入到结构化为您的csv的表中。
然后,在另一端,您可以从SQL读取数据并再次将其转换为.rds,或者直接将.csv发送过来。
https://stackoverflow.com/questions/65020129
复制相似问题