2011-01-22 168 views
5

我有一個很大的XML文件,其中包含許多子元素。我想能夠運行一些xpath查詢。我嘗試在java中使用vtd-xml,但有時會出現outofmemory錯誤,因爲xml非常大以適應內存。有沒有一種處理這種大型XML的替代方法。處理大型XML文件

+0

爲什麼在這個問題上的Python標籤?你希望人們會提供Python解決方案嗎? – Spaceghost

+0

解析文檔或嘗試xpath查詢時,是否出現內存不足錯誤?如果第二個,也許問題是與xpath查詢。 無論哪種方式,您是否嘗試增加JVM堆的-Xmx值? – Spaceghost

+0

嘗試擴展vtd-xml並使用內存映射選項 –

回答

2

大文件

+1

不能將XPath與直接SAX流一起使用(對每個查詢重新解析整個文件很少)。 –

+0

@Glenn Maynard - 但是當然,OP *必須爲每個查詢(或一批查詢)重新分析文件。 DOM太大而不適合內存。 –

2

什麼是你想現在做的工作時是非常有效的?通過它的聲音,您試圖使用基於DOM的解析器,它基本上將整個XML文件作爲DOM表示加載到內存中。如果你正在處理一個大文件,你最好使用一個SAX解析器,它以流的方式處理XML文檔。

我個人建議StAX這個。

0

你使用標準的vtd或擴展的VTD-xml嗎?如果你使用擴展的XML,那麼你可以選擇使用內存映射......你嘗試過嗎?

0

如果您計劃在長壽命的應用程序中動態編譯多個表達式,使用XPath可能不是一個好主意。

我不完全確定XPath的Java版本是如何工作的,但在.NET XPath中編譯動態程序集,然後將其添加到應用程序域。表達式的後續使用看看現在加載到內存中的程序集。
在一個案例中,我在使用XPath時導致了一種情況,我認爲,這種類型的機制正在減慢填充類似於內存泄漏的內存。

我的理論是,因爲每個表達式都是使用用戶的值編譯的,所以每個編譯的表達式都可能是唯一的,因此編譯了新的表達式並將其添加到應用程序域。
由於您可以從應用程序域中刪除程序集而無需重新啓動整個應用程序域,因此每次評估表達式時都會消耗內存,並且無法恢復。結果,代碼以內存中程序集的形式泄漏內存,過了一段時間,你就知道結果了。