我使用RODBC包连接到R中的SQL服务器数据库,并对数据库进行多次调用,对结果执行某些操作,将结果写入磁盘并删除所有变量。然后我调用gc()并在开始下一次迭代之前关闭通道。这大致如下所示。
for(i in 1:1000){
ch <- odbcConnect("some dsn")
result = sqlQuery(ch, 'SELECT * from table where some_condition = i')
#some processing here...
saveRDS(result, 'result.rdata')
# this should remove all object in memory
rm(result)
gc()
odbcClose(ch)
}
我的问题是随着循环的进行,R使用的内存量越来越大(尽管在Windows资源监视器中显示),尽管全局环境中对象的总大小没有增加。最终,我耗尽了我机器上可用的所有内存(16gb,Windows 7,64位),并且进程崩溃。
我尝试过的东西不起作用:
更改sqlQuery()中的buffsize,rows_at_time和believeNRows参数
sessionInfo() R版本3.2.0(2015-04-16) 平台:x86_64-w64-mingw32 / x64(64位) 运行于:Windows 7 x64(内部版本7601)Service Pack 1
区域设置: [1] LC_COLLATE = English_United Kingdom.1252 LC_CTYPE = English_United Kingdom.1252 LC_MONETARY = English_United Kingdom.1252 LC_NUMERIC = C LC_TIME = English_United Kingdom.1252
附加基础包: [1] stats graphics grDevices utils数据集方法库
其他附件包: [1] data.table_1.9.4 DBI_0.3.1 rsqlserver_1.0 rClr_0.7-4 text_0.0.0.9000 stringr_1.0.0 plyr_1.8.3 RODBC_1.3-11 rvest_0.2.0 tomr_0.0.0.9000
通过命名空间加载(而不是附加):
[1] Rcpp_0.12.0 lattice_0.20-31 XML_3.98-1.2 slam_0.1-32 grid_3.2.0 chron_2.3-47 R6_2.1.1 magrittr_1.5 httr_1.0.0 stringi_0.5-5 reshape2_1.4.1 NLP_0.1- 8 Matrix_1.2-1 tools_3.2.0
[15] parallel_3.2.0 tm_0.6-2