Pra*_*ani 19 memory memory-management r sqldf data.table
我有两个数据帧df1
和df2
每个有大约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.table
R包,用于对具有数百万条记录的对象进行有效操作.
该软件包的1.8.2版提供了一种rbindlist
功能,通过它您可以非常有效地实现您想要的功能.因此,rbind(a5r, a6r)
你可以:
library(data.table)
rbindlist(list(a5r, a6r))
Run Code Online (Sandbox Code Playgroud)