在rm()和gc()之后RODBC没有释放内存

时间:2015-09-09 13:26:21

标签: sql-server r memory-leaks rodbc

我使用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位),并且进程崩溃。

  • 为什么会这样?
  • 如何在不重新启动R的情况下强制R释放内存?

我尝试过的东西不起作用:

  • 按照此处https://stackoverflow.com/a/1467334/366502的建议多次调用gc()。
  • 更改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

0 个答案:

没有答案