2014-11-06 56 views
0

我正在寫一個函數來擦除一個巨大的XML文件。由於節點大約一百萬,我想使用foreach包。下面R當使用foreach doParallel和XML時崩潰

xmlfile=xmlParse(file="./DATI/xmldata.xml") #read the file 

#explore 
if(exists("dbfromxml")) rm(dbfromxml) 


root<-xmlRoot(xmlfile) 
persons<-xmlChildren(root) 
rm(root) 
nrecords<-xmlSize(persons) 

#set out the parallel framework 

library(foreach) 
library(doParallel) 
cores <- getOption("mc.cores", detectCores()) 
cl<-makeCluster(cores,outfile="ciao.txt") 
registerDoParallel(cl) 
dbfromxml<-foreach(i=1:10,.combine=rbind,.packages = "XML") %dopar% { 
personsxml<-persons[[i]] 
processaXMLPersona(personsxml) #this function works properly ouside a do parallel environment 
} 
stopCluster(cl) 

代碼和relevat評論當我設置了doParallel/makeCluster基礎設施負荷.packages =「XML」,使R型聚類崩潰出現的問題。出現以下錯誤:反序列化錯誤(socklist [[n]]):從連接讀取錯誤;序列化錯誤(數據,節點$ con):寫入連接時出錯

+0

'processaXMLPersona'從哪裏來?該錯誤表明您正試圖並行讀/寫連接。 – Roland 2014-11-06 15:54:25

+0

您好羅蘭processaXMLPersona是一個由源加載的函數。它接受和xmlobject。 – 2014-11-06 17:15:27

+0

由於並行運行該功能可能是您的問題,如果您不共享該功能,我不會看到我們如何幫助您。 – Roland 2014-11-06 18:22:33

回答

0

我想象的問題是XML包(通過libxml2)使用的指針在由foreach啓動的新進程中無效。這意味着要使其工作,必須在每個循環中獨立加載/解析XML文檔。