gpt4 book ai didi

xml - 由于 XML,R 不会停止获取内存/RAM

转载 作者:数据小太阳 更新时间:2023-10-29 02:00:21 25 4
gpt4 key购买 nike

我有一个如下所示的双循环问题是 R (2.15.2) 使用越来越多的内存,我不明白为什么。

虽然我知道这必须在内部循环中发生,因为我在那里做的 rbind(),但我不明白为什么 R 在外部循环的新循环时不断获取内存开始并且实际上对象('xmlCatcher')被重用:

# !!!BEWARE this example creates a lot of files (n=1000)!!!!

require(XML)

chunk <- function(x, chunksize){
# source: http://stackoverflow.com/a/3321659/1144966
x2 <- seq_along(x)
split(x, ceiling(x2/chunksize))
}

chunky <- chunk(paste("test",1:1000,".xml",sep=""),100)

for(i in 1:1000){
writeLines(c(paste('<?xml version="1.0"?>\n <note>\n <to>Tove</to>\n <nr>',i,'</nr>\n <from>Jani</from>\n <heading>Reminder</heading>\n ',sep=""), paste(rep('<body>Do not forget me this weekend!</body>\n',sample(1:10, 1)),sep="" ) , ' </note>')
,paste("test",i,".xml",sep=""))
}

for(k in 1:length(chunky)){
gc()
print(chunky[[k]])
xmlCatcher <- NULL

for(i in 1:length(chunky[[k]])){
filename <- chunky[[k]][i]
xml <- xmlTreeParse(filename)
xml <- xmlRoot(xml)
result <- sapply(getNodeSet(xml,"//body"), xmlValue)
id <- sapply(getNodeSet(xml,"//nr"), xmlValue)
dummy <- cbind(id,result)
xmlCatcher <- rbind(xmlCatcher,dummy)
}
save(xmlCatcher,file=paste("xmlCatcher",k,".RData"))
}

有人知道为什么会发生这种行为吗?请注意,所有对象(如“xmlCatcher”)在每个循环中都会重复使用,因此我假设使用的 RAM 在第一个“ block ”循环后应该保持大致相同。

  • 垃圾收集不会改变任何事情。
  • 不使用 rbind 不会改变任何事情。
  • 使用较少的 xml 函数实际上会减少内存占用 - 但为什么呢?

这是一个错误还是我遗漏了什么?

最佳答案

你对重用内存的理解是wong。

当您创建新的 DummyCatcher 时,旧的不再被引用,然后成为垃圾收集的候选者,这将在某个时候发生。

你不是在重用内存,你是在创建一个新的对象并抛弃旧的。

垃圾回收会释放内存。

此外,我建议您查看 Rprofmem 来分析您的内存使用情况。

关于xml - 由于 XML,R 不会停止获取内存/RAM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13986907/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com