2016-10-20 8 views
4

〜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」を使用してそれを行うには方法を見つけていないあなたの助け

+0

あなたは 'そこにどこかへの切り替え)' GCを(追加しようとする場合がありますので、あなたはすでに ')(フリー'使用しています'xml2'パッケージ(あなたがやっていること全てをサポートしているのかどうかは分かりませんが、いくつかの点でより良いメモリ管理があります)。 – hrbrmstr

+0

ありがとうございますが、それはしませんでした。ループの外側で 'gc() 'を実行しても、メモリはクリアされません。 –

+0

IIRCでは、 'XML'パッケージには回避できない既知のメモリリークがあります。代わりに['xml2'](https://cran.r-project.org/web/packages/xml2/index.html)を見てみてください。 –

答えて

1

いただきありがとうございます。 幸いにも、 '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) 
} 
関連する問題