Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R XML-无法从内存中删除内部C节点_C_R_Xml_Memory Management - Fatal编程技术网

R XML-无法从内存中删除内部C节点

R XML-无法从内存中删除内部C节点,c,r,xml,memory-management,C,R,Xml,Memory Management,我必须解析约2000个xml文档,从每个文档中提取某些节点,将它们添加到单个文档中,然后保存。我正在使用内部C节点,以便使用XPath。问题是,当我在文档上循环时,我无法从内存中删除内部C对象,最终使用的内存超过4GB。我知道问题不在于加载的树(我运行循环只是加载和删除每个文档的哈希树),而在于过滤节点或根节点 这是我正在使用的代码。我遗漏了什么以便在每次迭代结束时清除内存 xmlDoc <- xmlHashTree() rootNode <- newXMLNode("root")

我必须解析约2000个xml文档,从每个文档中提取某些节点,将它们添加到单个文档中,然后保存。我正在使用内部C节点,以便使用XPath。问题是,当我在文档上循环时,我无法从内存中删除内部C对象,最终使用的内存超过4GB。我知道问题不在于加载的树(我运行循环只是加载和删除每个文档的哈希树),而在于过滤节点或根节点

这是我正在使用的代码。我遗漏了什么以便在每次迭代结束时清除内存

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
包存在无法避免的已知内存泄漏。你可以试试看。