R:如何在不耗尽内存的情况下重新绑定两个巨大的数据帧

Pra*_*ani 19 memory memory-management r sqldf data.table

我有两个数据帧df1df2每个有大约10万行和4列.我使用RODBC/sqlQuery将它们读入R并没有任何问题,但是当我尝试rbind它们时,我得到了最可怕的R错误消息:cannot allocate memory.必须有更有效的方法来rbind提高效率 - 任何人都有他们想要分享的最喜欢的技巧吗?例如,我在doc中找到了这个例子sqldf:

# rbind
a7r <- rbind(a5r, a6r)
a7s <- sqldf("select * from a5s union all select * from a6s")
Run Code Online (Sandbox Code Playgroud)

这是最佳/推荐的方式吗?

更新 我使用上面调用中的关键dbname = tempfile()参数使其工作sqldf,正如JD Long在他对这个问题的回答中所建议的那样

G. *_*eck 26

而不是在开始时将它们读入R然后组合它们,您可以让SQLite读取它们并在将它们发送到R之前将它们组合.这样,文件永远不会单独加载到R.

# create two sample files
DF1 <- data.frame(A = 1:2, B = 2:3)
write.table(DF1, "data1.dat", sep = ",", quote = FALSE)
rm(DF1)

DF2 <- data.frame(A = 10:11, B = 12:13)
write.table(DF2, "data2.dat", sep = ",", quote = FALSE)
rm(DF2)

# now we do the real work
library(sqldf)

data1 <- file("data1.dat")
data2 <- file("data2.dat")

sqldf(c("select * from data1", 
 "insert into data1 select * from data2", 
 "select * from data1"), 
 dbname = tempfile())
Run Code Online (Sandbox Code Playgroud)

这给出了:

>  sqldf(c("select * from data1", "insert into data1 select * from data2", "select * from data1"), dbname = tempfile())
   A  B
1  1  2
2  2  3
3 10 12
4 11 13
Run Code Online (Sandbox Code Playgroud)

如果行顺序不重要,则此较短版本也可以使用:

sqldf("select * from data1 union select * from data2", dbname = tempfile())
Run Code Online (Sandbox Code Playgroud)

见sqldf主页http://sqldf.googlecode.com?sqldf获得更多信息.请特别注意文件格式参数,因为它们很接近但不相同read.table.在这里,我们使用了默认值,因此它不是一个问题.


nik*_*ola 20

注意data.tableR包,用于对具有数百万条记录的对象进行有效操作.

该软件包的1.8.2版提供了一种rbindlist功能,通过它您可以非常有效地实现您想要的功能.因此,rbind(a5r, a6r)你可以:

library(data.table)
rbindlist(list(a5r, a6r))
Run Code Online (Sandbox Code Playgroud)

  • 您可以在不先将数据集加载到内存中的情况下执行此操作吗? (2认同)