R XML-无法从内存中删除内部C节点
我必须解析约2000个xml文档,从每个文档中提取某些节点,将它们添加到单个文档中,然后保存。我正在使用内部C节点,以便使用XPath。问题是,当我在文档上循环时,我无法从内存中删除内部C对象,最终使用的内存超过4GB。我知道问题不在于加载的树(我运行循环只是加载和删除每个文档的哈希树),而在于过滤节点或根节点 这是我正在使用的代码。我遗漏了什么以便在每次迭代结束时清除内存R XML-无法从内存中删除内部C节点,c,r,xml,memory-management,C,R,Xml,Memory Management,我必须解析约2000个xml文档,从每个文档中提取某些节点,将它们添加到单个文档中,然后保存。我正在使用内部C节点,以便使用XPath。问题是,当我在文档上循环时,我无法从内存中删除内部C对象,最终使用的内存超过4GB。我知道问题不在于加载的树(我运行循环只是加载和删除每个文档的哈希树),而在于过滤节点或根节点 这是我正在使用的代码。我遗漏了什么以便在每次迭代结束时清除内存 xmlDoc <- xmlHashTree() rootNode <- newXMLNode("root")
xmlDoc <- xmlHashTree()
rootNode <- newXMLNode("root")
for (i in seq_along(all.docs)){
# Read in the doc, filter out nodes, remove temp doc
temp.xml <- xmlParse(all.docs[i])
filteredNodes <- newXMLNode(all.docs[i],
xpathApply(temp.xml,"//my.node[@my.attr='my.value'"))
free(temp.xml)
rm(temp.xml)
# Add filtered nodes to root node and get rid of them.
addChildren(rootNode, filteredNodes)
removeNodes(filteredNodes, free = TRUE)
rm(filteredNodes)
}
# Add root node to doc and save that new log.
xmlDoc <- addChildren(root)
saveXML(xmlDoc, "MergedDocs.xml")
xmlDoc因此,我发现使用“XML”无法避免内存泄漏和大量处理时间。
幸运的是,“xml2”现在可以处理文档和节点的创建。为了完整性起见,下面是使用“xml2”的解决方案。如果有人知道使用“XML”的方法,一定要插嘴
xmlDoc <- xml_new_document() %>% xml_add_child("root")
for (i in seq_along(all.docs)){
# Read in the log.
rawXML <- read_xml(all.docs[i])
# Filter relevant nodes and cast them to a list of children.
tempNodes <- xml_find_all(rawXML, "//my.node[@my.attr='my.value'")
theChildren <- xml_children(tempNodes)
# Get rid of the temp doc.
rm(rawXML)
# Add the filtered nodes to the log under a node named after the file name
xmlDoc %>%
xml_add_child(all.docs[i] %>%
xml_add_child(theChildren[[1]]) %>%
invisible()
# Remove the temp objects
rm(tempNodes); rm(theChildren)
}
xmlDoc%xml\u添加子项(“根”)
对于(我在序列中随附(所有文档)){
#阅读日志。
rawXML%
无形的
#删除临时对象
rm(临时节点);rm(儿童)
}
您已经在使用free()
,因此您可能希望尝试在其中的某个位置添加gc()
,或者切换到xml2
包(不确定它是否支持您正在做的所有事情,但在某些方面它有更好的内存管理)。谢谢,但它没有这样做。即使在循环外运行gc()
也不会清除内存。IIRC,XML
包存在无法避免的已知内存泄漏。你可以试试看。