2010-05-18 39 views
4

目前,我正在使用LIBXML :: SAXParser :: Callbacks來解析包含數據140,000個產品的大型XML文件。我正在使用任務將這些產品的數據導入到我的Rails應用程序中。用Ruby on Rails解析非常大的XML文件(1.4GB) - 有沒有比SAXParser更好的方法?

我最後的進口只花了不到10個小時才能完成:

rake asi:import_products --trace 26815.23s user 1393.03s system 80% cpu 9:47:34.09 total 

與目前執行的問題是,在XML的複雜的依存結構意味着,我需要跟蹤整個產品節點來知道如何正確解析它。理想情況下,我想要一種可以自己處理每個產品節點並能夠使用XPATH的方式,文件大小限制了我們使用需要將整個XML文件加載到內存中的方法。我無法控制原始XML的格式或大小。我最多可以使用3GB的內存。

有沒有比這更好的方法?

Current Rake Task code:

Snippet of the XML file:

+0

你需要在Ruby中完成嗎? C#或Java會成爲您願意考慮的選項嗎? – 2010-05-18 19:38:33

+0

它不需要在ruby中解析,但數據最終將被Rails應用程序使用。任何可以把它放到我的數據庫中的東西就足夠了。儘管如此,Ruby似乎是最容易解決這個特定問題的代碼。 我寧願不要在這個C#上使用C#,但如果其中一個提供了一個特別簡單的解決方案,我可以使用Java,PHP,Python或Perl。 – DBruns 2010-05-18 20:08:42

+0

查看擴展的VTD-XML或標準的vtd-xml,問題應該立即解決.. – 2010-05-18 20:21:00

回答

1

你可以先獲取整個文件?如果是這樣,那麼我建議將XML文件分成更小的塊(比如說512MB左右),這樣你就可以一次解析同時塊(每個內核一塊),因爲我相信你擁有現代CPU。關於無效或格式錯誤的xml - 只需通過簡單的字符串操作追加或預先添加缺少的XML。

你也可以嘗試分析你的回調方法。這是一大塊代碼,我很確定至少應該有一個瓶頸,可以爲你節省幾分鐘。

+0

是的,代碼並不漂亮,但速度只是一個小問題。最大的問題是在XML的一些定價和標準中處理依賴關係。由於它只是一個獨立產品的大名單,我可能會一次性分割文件並一次處理多個文件。這不是一個壞主意。 – DBruns 2010-05-18 19:35:56

相關問題