Pamięć wycieka parsując XML w r
Wycieki pamięci podczas używania pakietu XML w r nie są czymś nowym. Ten temat został już omówiony:
Poważny wyciek pamięci podczas iteracyjnej analizy plików XMLhttp://www.omegahat.org/RSXML/MemoryManagement.htmlhttp://r.789695.n4.nabble.com/memory-leak-using-XML-readHTMLTable-td4643332.htmlJednak po przeczytaniu wszystkich tych dokumentów nadal nie znam rozwiązania dla mojego konkretnego przypadku. Rozważ następujący kod:
library(XML)
GetHref = function(x)
{
subDoc = xmlChildren(x)
hrefs = ifelse(is.null(subDoc$a), NA, xmlGetAttr(subDoc$a, 'href'))
rm(subDoc)
return(hrefs)
}
url = 'http://www.atpworldtour.com/Share/Event-Draws.aspx?e=338&y=2013'
parse = htmlParse(url)
print(.Call("R_getXMLRefCount", parse)) #prints 1
NodeList = xpathSApply(parse, "//td[@class='col_1']/div/div/div[@class='player']")
print(.Call("R_getXMLRefCount", parse)) #prints 33
PlNames = sapply(NodeList, xmlValue, trim = T)
print(.Call("R_getXMLRefCount", parse)) #prints 33
hrefs = sapply(NodeList, GetHref)
print(.Call("R_getXMLRefCount", parse)) #prints 157
rm(NodeList)
gc()
print(.Call("R_getXMLRefCount", parse)) #prints 157
Wydaje się, że wewnętrzne węzły XML utworzone podczas przetwarzania końcowego nie zostaną usunięte. Jakie byłoby rozwiązanie w tym przypadku?
Session Info:
R version 3.0.2 (2013-09-25)
Platform: i386-w64-mingw32/i386 (32-bit)
locale:
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C LC_TIME=English_United States.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] XML_3.98-1.1
loaded via a namespace (and not attached):
[1] tools_3.0.2