2014-02-07 75 views
2

我需要連接到一個外部XML文件來下載和處理(300MB +)。 然後運行XML文檔並將數據保存到數據庫中。open-uri和sax解析一個巨大的xml文檔

我已經在生產服務器上用Saxerator在內存上溫和地做這個沒問題。它效果很好。這裏是我的問題 -

我需要使用open-uri(雖然可能有其他解決方案?)來抓取文件來解析。這個問題是open-uri必須在任何開始分析之前加載整個文件,這違背了使用SAX解析器保存內存的全部目的......任何解決方法?我可以只從外部XML文檔讀取嗎?我無法加載整個文件或者崩潰了我的服務器,並且由於文檔每30分鐘更新一次,所以我不能將它保存在我的服務器上(儘管這是我目前正在做的工作,以確保所有內容都可以正常工作)。

我在做這個Ruby,p.s.

回答

1

你可能想嘗試的Net :: HTTP的streaming interface,而不是開放的URI。這將給Saxerator(通過底層的Nokogiri :: SAX :: Parser)一個IO對象而不是整個文件。

+0

這正是我所期待的。非常感謝你! –

+1

只是想說,我實現了這一點,並完美地工作。 –

0

我花了幾分鐘的時間寫下來,然後意識到你用ruby標記了這個問題。我的解決方案是用Java編寫的,所以我對此表示歉意。我仍然在這裏包括它,因爲它可能對你或某個人有用。

這始終是我是如何處理大量的外部XML文件

XMLReader xmlReader = SAXParserFactory.newInstance().newSAXParser().getXMLReader(); 
xmlReader.setFeature("http://xml.org/sax/features/namespaces", true); 
XMLFilter filter = new XMLFilterImpl(); 

filter.setParent(xmlReader); 

filter.parse(new InputSource(new BufferedReader(new InputStreamReader(new URL("<url to external document here>").openConnection().getInputStream(),"UTF8"))));