2014-06-30 109 views
5

我想运行一些简单的程序从HTML代码中提取表。但是,XML包中的readHTMLTable似乎存在一些内存问题。有什么方法可以轻松解决这个问题吗?就像以某种方式为该命令指定一些特殊内存然后手动释放它。解决R内存泄漏与XML包

我试图把它放在一个函数中,并尝试使用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位的尝试。

+0

我在Windows上使用'XML'包时遇到了严重的内存问题。我的解决方案是定期重新启动R(将数据保存为CSV)。我通过电子邮件发送了软件包作者。我们交换了一些电子邮件,但他基本上说他不能/不会调试Windows。 – rrs

+0

好的。重新启动R的作品,但它不是很好的手动工作,每5分钟做一次。我想唯一的办法就是切换到Linux。 XML是非常酷的软件包,但由于这些内存问题而令人遗憾地被破坏。 – Pekka

回答

0

我在XML pakackage中也有很多问题(在windows和linux下),但我最终解决它的方法是在每个处理步骤结束时删除对象,即添加一个rm (b)和每次迭代结束时的gc()。让我知道这是否也适合你。

+0

对循环内部或循环之后都没有帮助。 – Pekka

+0

那么我所做的就是把XML处理放在一个返回输出的函数XMLproc中,并且在我调用XMLproc的函数中添加了rm(out)和gc()。你可以检查一下,如果这对你有用吗? –

+0

我没有得到这样的作品。我在原始问题中添加了一些我尝试的内容。 – Pekka

0

这里同样的问题,甚至没有什么比在doc <- xmlParse(...); root <- xmlRoot(doc)的文档中读取更多,分配给doc的内存从来没有被释放到O/S(如在Windows的任务管理器中监视)。

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

+0

我通过很长一段时间移动到Python和BeautifulSoup解决了这个问题:) 无论如何,感谢您的帮助。我会很快尝试你的解决方案。 – Pekka

+0

另请参阅我在http://stackoverflow.com/questions/23696391/memory-leak-when-using-package-xml-on-windows/上提出的答案使用新的xml2库来代替(我将它发布为答案也是这个问题,但有人删除它)。 –

0

从Win 3.x上的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包也有类似的问题,存储器可以通过用跟随gc()功能remove_xml()被释放。