2011-03-16 145 views
2

我們一直在使用libxml-ruby幾年。對於30 MB或更少的文件來說太棒了,但它被seg故障所困擾。項目中沒有人真的似乎在解決它們,只是爲了將這些歸咎於第三方軟件。這是他們的特權,當然是免費的。如何使用libxml-ruby在Ruby中讀取大型XML文件?

但我仍然無法閱讀這些大文件。我想我可以寫一些悲慘的黑客把它們分成更小的文件,但我想避免這種情況。有沒有人有任何閱讀Ruby中非常大的XML文件的經驗?

+0

https://github.com/amolpujari/reading-huge-xml – 2012-07-14 06:58:10

回答

3

我建議您調查一下SAX XML parser。它們旨在處理巨大的文件。我不需要一段時間,但是它們很容易使用;當它讀取其中的XML文件時,它會傳遞您的代碼各種事件,您可以使用代碼捕獲並處理這些事件。

Nokogiri site有鏈接到SAX Machine這是基於Nokogiri,所以這將是另一種選擇。無論如何,Nokogiri得到了很好的支持,並被很多人使用,包括我在內的所有HTML和XML解析。它支持DOM和SAX解析,允許使用CSS和XPath訪問器,並使用libxml2進行解析,因此速度很快並基於標準解析庫。

6

當加載大文件時,無論它們是否爲xml,您都應該開始考慮一次一個文件(本例中稱爲流文件),而不是將整個文件加載到內存中。

我強烈建議閱讀this article about pull parsers。使用這種技術將使您可以更輕鬆地讀取該文件,而不是一次將所有文件加載到內存中。

+0

+1。非常好的鏈接。 – steenslag 2011-03-16 01:21:45

+0

我認爲JRuby的,VTD-XML的功能更強大,使用更方便比拉 – 2011-03-16 07:48:54

3

的libxml-紅寶石確實有很多錯誤,而不僅僅是崩潰錯誤,但不兼容的版本,內存泄漏等......

我強烈建議Nokogiri。作爲快速XML解析的新熱點,Ruby社區已經聚集在Nokogiri周圍。它有一個reader pull parser,SAX parser和您的標準in-memory DOM-ish parser

對於真正大的XML文件,我推薦使用Reader,因爲它與SAX一樣快,但編程起來更容易,因爲您不必手動跟蹤這麼多狀態。

+0

這是什麼讀者你說話約翰? – AKWF 2011-03-16 06:33:46

+0

對不起,我的意思是Nokogiri :: XML :: Reader,Nokogiri的pull語法分析器http://nokogiri.org/Nokogiri/XML/Reader.html – 2011-03-16 06:39:15

+0

我在小文件上使用Nokogiri,但這些文件對於Nokogiri來說太大。 – AKWF 2011-03-16 13:36:31

4

感謝大家對我們的出色投入。我能夠通過查看 Processing large XML file with libxml-ruby chunk by chunk來解決我的問題。

答案是避免使用:

reader.expand 

和改用:

reader.read 

或:

reader.next 

結合:

reader.node 

只要你不試圖存儲節點,它就很好。你想立即在該節點上操作,因爲reader.next會將它吹走。

要回答以前的答案,從我能理解的情況來看,libxml-ruby是一個流解析器。垃圾收集問題引起了Seg錯誤的問題,這些問題導致了內存泄漏。一旦我學會了不使用reader.expand,一切都變成了玫瑰。

UPDATE:

我無法畢竟解決我的問題。沒有使用reader.expand,似乎沒有辦法到達子樹。

所以我想沒有辦法讀取和解析一個大的XML文件與libxml紅寶石?自2009年以來,reader.expand內存泄漏漏洞已經開放,甚至沒有迴應。失敗失敗失敗。

+0

是的,不幸的是#exapand存在內存泄露:http://rubyforge.org/tracker/index.php?func=detail&aid=26297&group_id=494&atid=1971 – 2011-03-16 01:54:52

+1

根據跟蹤器,2011年4月修復了這個問題 – 2013-01-24 00:13:27