使用XML包解决R内存泄漏问题

时间:2014-06-30 19:31:01

标签: xml r memory-leaks web-scraping

我正在尝试运行一些简单的程序来从html代码中提取表格。但是,XML包中的readHTMLTable似乎存在一些内存问题。有什么方法可以轻松地解决这个问题。就像以某种方式为这个命令指定一些特殊的内存然后手动释放它。

我试图把它放在一个函数中并尝试使用gc()和不同版本的R和这个包,似乎什么都没有用。我开始绝望了。

示例代码。如何在不破坏内存大小的情况下运行它?

library(XML)
a = readLines("http://en.wikipedia.org/wiki/2014_FIFA_World_Cup")
while(TRUE) {
    b = readHTMLTable(a)
    #do something with b
}

编辑: 这样的事情仍然占据了我的全部记忆:

library(XML)
a = readLines("http://en.wikipedia.org/wiki/2014_FIFA_World_Cup")
f <- function(x) {
    b = readHTMLTable(x)
    rm(x)
    gc()
    return(b)
}

for(i in 1:100) {
    d = f(a)
    rm(d)
    gc()
}
rm(list=ls())
gc()

我正在使用win 7并尝试使用32位和64位。

3 个答案:

答案 0 :(得分:1)

从Win3上的XML 3.98-1.4和R 3.1开始,使用函数free()可以很好地解决这个问题。但它不适用于readHTMLTable()。以下代码完美无缺。

library(XML)
a = readLines("http://en.wikipedia.org/wiki/2014_FIFA_World_Cup")
while(TRUE){
   b = xmlParse(paste(a, collapse = ""))
   #do something with b
   free(b)
}

xml2包有类似的问题,可以使用函数remove_xml()后跟gc()来释放内存。

答案 1 :(得分:0)

我在XML包装中也遇到了很多内存泄漏的问题(在windows和linux下),但我最终解决它的方法是在每个处理步骤结束时删除对象,即添加一个rm( b)和每次迭代结束时的gc()。如果这对您有用,请告诉我。

答案 2 :(得分:0)

这里的问题相同,即使只是用doc <- xmlParse(...); root <- xmlRoot(doc)读取文档,分配给doc的内存永远不会释放到O / S(在Windows的任务管理器中监视)

我们可能尝试的一个疯狂想法是使用system("Rscript ...")在单独的R会话中执行XML解析,将解析的R对象保存到文件中,然后我们在主R会话中读取该文件。 Hacky但它​​至少可以确保XML解析吞噬的任何内存都会在Rscript会话终止时释放,并且不会影响主进程!