2014-10-19 43 views
0

我試圖處理維基百科轉儲發現here。特別是使用文件--enwiki-latest-pages-articles-multistream.xml.bz2。這是約46GB未壓縮。我目前在Java(xerces)中使用STAX解析器,並且能夠每秒提取15K頁元素。然而,瓶頸似乎是解析器,我已經玩弄了aalto-xml,但它沒有幫助。並行處理維基百科的XML與數據轉儲風暴

因爲我正在分析Storm噴口中的每個頁面元素,所以它是一個瓶頸。不過,我認爲我可以簡單地在...標籤之間發送文本,並有幾個螺栓並行處理每個頁面元素。這將減少Storm噴頭必須執行的工作量。但我不確定採取什麼具體方法。如果我使用解析器來提取標籤之間的內容,那麼這意味着它會解析從標籤開始到結束的每一個元素。有沒有辦法在標準的SAX/STAX解析器中消除這種開銷?

+0

我不知道它可能如何。爲了知道你想要原始XML的標籤已經關閉了,我會認爲它需要解析所有的XML內容。否則,它出現的結束標記可能與您實際需要的標記不清晰,而另一個由於引入的名稱空間而受到影響,例如,看起來要完成這個需要通常不安全的假設,也許只能在特定情況下應用。 – 2014-11-05 14:10:01

+0

'Xerces'不是一個Stax解析器;也許你正在考慮SAX?至於使用阿爾託;因爲它的速度至少是Xerces的2倍,所以如果你沒有觀察到變化,你可能會錯誤地使用它(比如不重複使用'XMLInputFactory' - 創建這些代價非常昂貴),或者瓶頸不在XML解析和/或一代? – StaxMan 2016-04-01 00:48:39

回答

0

我嘗試了類似的嘗試平行。

無論如何,因爲我使用維基百科數據完成許多任務,生成一個文章的perline-dump只需要更簡單,然後我就可以同時運行多個實驗。 運行只需要幾分鐘,然後我可以非常容易地將一個轉儲給Spark(在您的情況下爲Storm)。

如果你想使用我們的工具檢查: https://github.com/idio/wiki2vec

0

有沒有辦法做到在XML文檔的隨機訪問,但許多Java的XML解析器有未使用的內容某種程度上更高效的跳躍:阿爾託和Woodstox例如推遲對字符串值的解碼(以及構造String對象),以便如果標記被跳過,則不需要分配。

一兩件事,以確保使用StAX是不使用Event API,除非有特殊需要緩衝內容 - 它不會隨着基本流API(XMLStreamReader)提供了許多功能,但每XMLEvent確實增加了顯著分配開銷無論是否需要,都可以構建。另一方面,Streaming API僅指示事件/令牌的類型,並且讓調用者決定是否需要內容(屬性,文本值)並且可以避免大部分對象分配。