讀取XML數據如下面的代碼是否在內存中創建DOM樹?我應該如何解析Perl中的大型XML文件?
my $xml = new XML::Simple;
my $data = $xml->XMLin($blast_output,ForceArray => 1);
對於大的XML文件,我應該使用一個SAX分析器,處理程序等?
讀取XML數據如下面的代碼是否在內存中創建DOM樹?我應該如何解析Perl中的大型XML文件?
my $xml = new XML::Simple;
my $data = $xml->XMLin($blast_output,ForceArray => 1);
對於大的XML文件,我應該使用一個SAX分析器,處理程序等?
我會對兩者都說是。 XML :: Simple庫將在內存中創建整個樹,並且它在文件大小上是一個很大的倍數。對於許多應用程序來說,如果你的XML超過100MB左右,那麼在perl中完全加載到內存中是不現實的。 SAX解析器是一種在讀取文件並打開或關閉標籤時獲取「事件」或通知的方式。
根據您的使用模式,SAX或基於DOM的解析器可能會更快:例如,如果您試圖在大文件中處理少數節點或每個節點,SAX模式可能最好。例如,閱讀一個大的RSS提要,並嘗試解析其中的每個項目。另一方面,如果您需要將文件的一部分與另一部分進行交叉引用,則DOM解析器或通過XPath訪問會更有意義 - 以「從內到外」的方式編寫SAX解析器需要笨拙和棘手。
我建議至少嘗試一次SAX解析器,因爲事件驅動的思維需要這樣做是很好的練習。
我用XML :: SAX :: Machines在perl中設置SAX解析方面取得了很好的成功 - 如果您想要多個過濾器和管道,那麼它很容易設置。對於更簡單的設置(即99%的時間),您只需要一個sax過濾器(查看XML :: Filter :: Base),並告訴XML :: SAX :: Machines只使用文件句柄解析文件(或從文件句柄讀取)你的過濾器。 Here's a thorough article.
我之前沒有使用XML :: Simple模塊,但是從documentation看來它在內存中創建了一個簡單的哈希。這不是一個完整的DOM樹,但可能足以滿足您的要求。
對於大型XML文件,使用SAX解析器會更快,並且內存佔用空間更小,但它會再次取決於您的需求。如果您只需要以串行方式處理數據,那麼使用XML::SAX可能會滿足您的需求。如果你需要操縱你的整個樹,那麼也許使用像XML::LibXML這樣的東西對你會更好。
這是所有馬匹的課程恐怕
對於大型XML文件,您可以使用XML ::的libxml,在DOM模式中,如果文檔裝入內存,或使用拉模式(見XML::LibXML::Reader )或XML::Twig(我寫的,所以我有偏見,但它適用於太大而不適合內存的文件)。
我不是SAX的粉絲,這很難使用,而且實際上很慢。
我對大文件使用'XML :: Twig' – 2009-12-03 17:24:45
我喜歡'XML :: Twig'和'XML :: LibXML :: Reader',但我傾向於使用後者,因爲它比Twig快得多。 。 – Onlyjob 2014-08-25 02:18:45
你想對文件做什麼?爲了將來的操作,你需要保存多少內存?我們不能告訴你在不知道你需要做什麼的情況下使用什麼。 – 2009-12-03 17:18:44
作爲一個數據點,我嘗試過使用XML :: Simple來解析維基共享資源的XML轉儲,但那是很大的(在運行Ubuntu的舊桌面盒子上)。 – 2009-12-06 09:20:17