新興XML處理方法VTD-XML介紹(2)_Xml教程
推薦:怎樣使用XML實現多渠道接入網站的構架一.背景在現在的網站中,接入的渠道是越來越多了,技術也是越來越先進,WAP, SMS,EMAIL, 傳統的Web, Socket等等,如果連數據庫和LDAP也算接入的話,那在設計之中需要擴展的空間要做到很好 很好
出路
VTD-XML便是對以上問題的思考后給出的答案,它是一個non-extractive XML parser,由于它出色的機制,很好的解決(避免)了上面所提出的各種問題,并且還“順便”帶來了non-extractive的其他好處,像快速的解析與遍歷、XPath的支持、Incremental Update等等。我這里有一組數據,取自于VTD-XML的官方網站:
VTD-XML的解析速度是SAX(with NULL content handler)的1.5x~2.0x。With NULL content handler的意思就是說SAX解析中沒有插入任何額外的處理邏輯,也就是SAX的最高速度。
VTD-XML的內存占用是原XML的1.3x~1.5x(其中1.0x的部分是原XML,0.3x~0.5x是VTD-XML占用的部分),而DOM的內存占用則是原XML的5x~10x。舉一個例子,如果一個XML的大小是50MB,那么用VTD-XML讀取進來內存占用會在65MB~75MB之間,而DOM的內存占用則會在250M~500MB之間。基于這個數據用DOM處理大的XML文件幾乎是不可能的選擇。
你可能會覺得不可思議,真的可以做出比DOM易用性還好,比SAX還快的XML解析器嗎?別急著下定論,還是來看看VTD-XML的原理吧!
基本原理
就像大多數好的產品一樣,VTD-XML的原理并不復雜,而是很巧妙。為了實現non-extractive這個目的,它將原XML文件原封不動的以二進制的方式讀進內存,連解碼都不做,然后在這個byte數組上解析每個element的位置并把一些信息記錄下來,之后的遍歷操作便在這些保存下來的record上進行,如果需要提取XML內容就利用record中的位置等信息在原始byte數組上進行解碼并返回字符串。這一切看起來都很簡單,但是,這個簡單的過程確有多個性能細節在里邊,并且隱藏了若干個潛在的能力。下面我們首先來描述一下各個性能細節:
為了避免過多的對象創建,VTD-XML決定采用原始的數值類型作為record的類型,這樣就可以不必用heap。VTD-XML的record機制就叫做VTD(Virtual Token Descriptor),VTD將性能瓶頸在tokenization階段就解決掉了真的是很巧妙很用心的做法。VTD是一個64bits長度的數值類型,記錄了每個element的起始位置(offset),長度(length),深度(depth)以及token的類型(type)等信息。
注意VTD是固定長度的(官方決定用64bits),這樣做的目的就是為了提高性能,因為長度固定,在讀取,查詢等操作的時候格外的高效(O(1)),也就是可以用數組這種高效的結構來組織VTD大大減少了因為大量使用對象而產生的性能問題。
VTD的超能力(一點都不夸張地說)就在于它能夠將XML這種樹形的數據結構簡單的變換成對一個byte數組的操作,任何你能想象到的對于byte數組的操作都可以應用在XML上了。這是因為讀取進來的XML是二進制的(byte數組),而VTD則記錄了每個element的位置等訪問用信息,當我們找到要操作的VTD的時候,只要用offset與length等信息就可以對原始byte數組進行任何操作,或者可以直接對VTD進行操作。舉例來說,我想在一個大XML中找出一個element并刪除它,那么我只需要找到這個element的VTD(遍歷方法稍候再講),將這個VTD從VTD數組中刪除,然后再利用所有的VTD寫出到另一個byte數組中就可以了,因為刪除的VTD標明了要刪除的element的位置,所以在新寫入的byte數組中就不會出現這段element了,用VTD寫入新的byte數組實際上就是一個byte數組的拷貝,其效率相當的高,這就是所謂的增量更新(incremental update)。
關于VTD-XML的遍歷方式,它采用了LC (Location Cache),簡單地說就是將VTD以其深度作為標準構建的一個樹形的表結構。LC的entry也是64bits長的數值類型,前32bits代表一個VTD的索引(index),后32bits代表了這個VTD的第一個child的索引。利用這些信息就可以計算出任何一個你想要到達的位置了,關于具體的遍歷方法請參看官方網站的文章。基于這種遍歷方式的VTD-XML有與DOM不同的操作接口,這是可以理解的,并且,VTD-XML的這種遍歷方式可以在最少的幾步內將你帶到你所需要的地方去,遍歷的性能十分突出。
總結
就像你上面看到的,VTD-XML有著迷人的特性,而如今的1.5版本中已經加入了XPath的支持(只要可以遍歷,就可以支持XPath,這是早晚的事:-)),它的實用性已經超越了當今我們所想象的范圍了。另一個VTD-XML的超能力,就是基于它現在的處理方式,完全可以支持將來的Binary XML標準,并通過Binary化將XML的應用推向更高一層樓!這也是我目前所期待的!:-)
不過,VTD-XML仍然有許多需要改進與完善的地方,這方面值得我們努力與探討。
順便提一下,VTD-XML是開源項目(GPL),目前有Java、C兩種平臺支持。如果你想在.NET試一試的話建議你使用IKVM(BSD style license)將VTD-XML轉換成.NET程序集,相信你會喜歡上它的!;-)
分享:解讀從實際應用中了解WML學習自然語言的最好方法就是溶入相應的語言環境在交流中學習,學習一種編程語言的最好方法就是看例程。為了幫助大家建立wml應用的第一印象,所以請大家先看第一個例子:
- 相關鏈接:
- 教程說明:
Xml教程-新興XML處理方法VTD-XML介紹(2)。