〜2000 xml文書を解析し、各文書から特定のノードを抽出し、それらを単一の文書に追加して保存する必要があります。私はXPathを使用できるように内部Cノードを使用しています。問題は、ドキュメントをループして、内部Cオブジェクトをメモリから削除することができず、使用メモリが> 4GBを超えてしまうことです。私は、問題が読み込まれたツリーではないことを知っています(各ドキュメントのハッシュツリーをロードして削除するだけでループを実行しました)が、フィルタされたノードまたはルートノードを使用しています。R XML - メモリから内部Cノードを削除できません
ここに私が使用しているコードがあります。私は何が欠けているので、各繰り返しの終わりに記憶をクリアすることができますか?
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")
だから私は、メモリリークや処理時間があまりなく「XML」を使用してそれを行うには方法を見つけていないあなたの助け
あなたは 'そこにどこかへの切り替え)' GCを(追加しようとする場合がありますので、あなたはすでに ')(フリー'使用しています'xml2'パッケージ(あなたがやっていること全てをサポートしているのかどうかは分かりませんが、いくつかの点でより良いメモリ管理があります)。 – hrbrmstr
ありがとうございますが、それはしませんでした。ループの外側で 'gc() 'を実行しても、メモリはクリアされません。 –
IIRCでは、 'XML'パッケージには回避できない既知のメモリリークがあります。代わりに['xml2'](https://cran.r-project.org/web/packages/xml2/index.html)を見てみてください。 –