我們一直在使用libxml-ruby幾年。對於30 MB或更少的文件來說太棒了,但它被seg故障所困擾。項目中沒有人真的似乎在解決它們,只是爲了將這些歸咎於第三方軟件。這是他們的特權,當然是免費的。如何使用libxml-ruby在Ruby中讀取大型XML文件?
但我仍然無法閱讀這些大文件。我想我可以寫一些悲慘的黑客把它們分成更小的文件,但我想避免這種情況。有沒有人有任何閱讀Ruby中非常大的XML文件的經驗?
我們一直在使用libxml-ruby幾年。對於30 MB或更少的文件來說太棒了,但它被seg故障所困擾。項目中沒有人真的似乎在解決它們,只是爲了將這些歸咎於第三方軟件。這是他們的特權,當然是免費的。如何使用libxml-ruby在Ruby中讀取大型XML文件?
但我仍然無法閱讀這些大文件。我想我可以寫一些悲慘的黑客把它們分成更小的文件,但我想避免這種情況。有沒有人有任何閱讀Ruby中非常大的XML文件的經驗?
我建議您調查一下SAX XML parser。它們旨在處理巨大的文件。我不需要一段時間,但是它們很容易使用;當它讀取其中的XML文件時,它會傳遞您的代碼各種事件,您可以使用代碼捕獲並處理這些事件。
Nokogiri site有鏈接到SAX Machine這是基於Nokogiri,所以這將是另一種選擇。無論如何,Nokogiri得到了很好的支持,並被很多人使用,包括我在內的所有HTML和XML解析。它支持DOM和SAX解析,允許使用CSS和XPath訪問器,並使用libxml2進行解析,因此速度很快並基於標準解析庫。
當加載大文件時,無論它們是否爲xml,您都應該開始考慮一次一個文件(本例中稱爲流文件),而不是將整個文件加載到內存中。
我強烈建議閱讀this article about pull parsers。使用這種技術將使您可以更輕鬆地讀取該文件,而不是一次將所有文件加載到內存中。
+1。非常好的鏈接。 – steenslag 2011-03-16 01:21:45
我認爲JRuby的,VTD-XML的功能更強大,使用更方便比拉 – 2011-03-16 07:48:54
的libxml-紅寶石確實有很多錯誤,而不僅僅是崩潰錯誤,但不兼容的版本,內存泄漏等......
我強烈建議Nokogiri。作爲快速XML解析的新熱點,Ruby社區已經聚集在Nokogiri周圍。它有一個reader pull parser,SAX parser和您的標準in-memory DOM-ish parser。
對於真正大的XML文件,我推薦使用Reader,因爲它與SAX一樣快,但編程起來更容易,因爲您不必手動跟蹤這麼多狀態。
感謝大家對我們的出色投入。我能夠通過查看 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內存泄漏漏洞已經開放,甚至沒有迴應。失敗失敗失敗。
是的,不幸的是#exapand存在內存泄露:http://rubyforge.org/tracker/index.php?func=detail&aid=26297&group_id=494&atid=1971 – 2011-03-16 01:54:52
根據跟蹤器,2011年4月修復了這個問題 – 2013-01-24 00:13:27
https://github.com/amolpujari/reading-huge-xml – 2012-07-14 06:58:10