2015-06-22 19 views
2

我正在解析一堆具有類似表類數據的XML,並希望將它們連接到一個data.table中,以便隨後執行我的計算。我使用XML包進行解析,有大約10,000個xml文件需要解析,每個文件裏面都有15-150行(確切的數字我事先不知道)。我目前的做法是:提高將數據追加到data.table的性能

sol <- data.table() 
for(i in seq_len(length(xml_list))) { 
    i.xml <- xmlParse(xml_list[[i]] 
    i.component <- as.data.table(xmlToDataFrame(..)) 
    sol <- rbindlist(list(i.component,sol),use.names=T,fill=T) 
} 
sol 

此過程需要大約一小時的數據。有人可以指點我一種方法來大幅提高此解析的性能嗎?

我在想的可能的方式是:以某種方式預先爲更大的data.table分配內存,並追加行而不是在每一步中重新複製整個事物?或者,也許有更快的XML解析器,我可以使用?或者可能同時解析列表中的XML,而不是順序解析(因爲它們都是一樣的)。

+0

任何方式發佈其中一個XML文件,或者它是受限制的數據? – hrbrmstr

+0

@hrbrmstr,不幸的是它受到了懲罰。關於結構,我後面的節點是樹的幾個步驟,我要查找的值是在標記內而不是屬性。還有一些列是字符串,有些是數字。如果您有更具體的問題,我可以嘗試提供更多細節。 –

回答

2

你是遞歸的rbinding你的成長data.table與每個新的小增加(10,000+致電rbindlist!)。最好創建data.tables一個長長的清單,然後調用rbindlist一次:

ll <- lapply(xml_list , function(x) as.data.table(xmlParse(x))) 
dt <- rbindlist(ll) 

我想像這種格式你的大部分處理時間會花在閱讀和解析XML文件。

+0

非常感謝Simon,我的處理時間縮短了大約20分鐘。任何關於提高XML解析速度的建議? –

+0

@SergiiZaskaleta恐怕我不太熟悉xmlParse函數或包。我想你需要直接看看這個功能,看看你是否可以加速這個部分。 –

0

你有沒有完成分析,看看時間到了哪裏?我認爲大部分時間都在將XML轉換爲data.table。你需要XML中的所有數據作爲data.table的一部分嗎?看到一個XML的例子,你可以「掩蓋」你的私人數據,這樣我們就可以理解你爲什麼要這樣做。

我總是問「告訴我你想做什麼,而不是你想做什麼。」可能還有其他更快捷的方法,但沒有數據很難提出建議。