田冬迪
(上海師慶科技發展有限公司 上海市 201103)
“互聯網+”時代背景下,伴隨著物聯網、大數據、區塊鏈等技術概念的發展和衍變,空間數據呈現海量、異構、數據源眾多[1]、多樣化的趨勢,將其空間位置屬性應用于非實時數據支撐亦或是實時數據應用探索[2]以及隱藏空間信息挖掘,商業價值和社會價值有無限的可能性。基于地理信息和空間位置的業務系統應用隨著各行業的發展日益增多,由此形成的空間數據需要通過建立空間數據庫進行高效的存儲、管理、運維。空間數據庫是以空間數據作為存儲對象的專業數據庫[3],其發展經歷了從平面文件(Flat-file)、關系數據庫(RDBMS)、對象關系數據庫(Object Relational Database)的演變過程[4]。空間數據庫將空間數據與對象關系數據庫的集成,真正實現了以GIS為中心向以數據庫為中心的轉變,同時也為通過SQL語言操作空間數據奠定了基礎。PostgreSQL開源數據庫以其開源特性和成本優勢及可擴展的結構,并支持PostGIS空間數據引擎和空間數據模型理論[5],為實現空間數據的分析、建模、空間信息挖掘提供了新的技術路線及方法,在成本、質量、可拓展性上優于大型商用數據庫[6]。在空間查詢分析方面,相較于分布式解決方案,加載PostGIS的PostgreSQL可以通過支持單臺計算機多線程并行計算的形式優化運行效率,為空間數據查詢分析以及地理信息系統平臺開發應用提供了新的解決方案,同時也拓展了開源生態鏈并豐富了開源生態系統。
本文研究探索以點、線、面多元空間要素數據為研究對象,借助PostgreSQL加載PostGIS開源數據庫引擎建立了不同數據量級的空間數據庫,通過Python構建多線程并行計算的方法,實現對PostgresSQL/PostGIS的空間查詢運行效率的優化。
PostgreSQL對空間數據的存儲、管理及服務支持是通過PostGIS來實現的,遵循OpenGIS聯盟(OGC)的規范,支持的GIS對象是OGC定義的“SimpleFeatures(簡單要素)”標準的超集;同時支持OGC“SimpleFeaturesfor SQL”規范(SFS)中指定的所有對象和函數,同時也支持"SQL/MM"規范的幾何對象。PostGIS擴展了該標準,支持嵌入式SRID信息[7]。在Geometry對空間數據的存儲使用了OGC推薦的WKT(Well-Known Text)和WKB(Well-Known Binary)格式表達集合對象,大幅增加了易用性。PosGIS支持WKT的7個基本空間數據類型:Point(點)、Linestring(線)、Polygon(多邊形)、MultiPoint(多點)、MultiLinestring(多線)、MultiPolygon(多多邊形)和Geometry Collection(幾何集合)等。空間數據組織結構圖如圖1所示。

圖1:空間數據類型組織結構圖
空間索引的建立為空間數據庫對海量空間數據集的查詢分析應用奠定了基礎。PostgreSQL數據庫支持B-Treeindexes、R-Treeindexes和GiST indexes 3種索引。GiST用于廣泛的數據結構,可加快各種不規則數據結構(整形數組,光譜數據等)的查詢速度,包括空間數據。PostGIS是在GiST的基礎上實現R-Tree去索引地理數據,將數據切分為矩形,子矩形,子子矩形等,通過自動處理可變的數據密度和對象大小的自協調的索引結構,極大提高了了構建空間連接時表比較的效率。
在構造空間查詢優化并行計算方法時,需要根據空間索引對預選的分析記錄數進行等分,將輸入查詢數據分成若干子組,由不同的處理器核進行處理,通過并行計算對數據集的不同部分調用相同的SQL查詢來執行。由于SQL查詢的并行執行,該方法在PostgreSQL/PostGIS數據庫空間索引限制的基礎上,計算過程中不需要磁盤寫入操作的情況下選擇數據集的特定部分,將SQL查詢結果以變量的形式返回到不同的數據集中,最終組合成一個完整的數據集,并保存到單獨文件中的磁盤或參與分析的數據庫中。
維數擴展的9交集模型(DE-9IM,The Dimensionally Extended nine-Intersection Model)是用于描述兩個空間對象在空間位置上相互交互的框架,其定義空間對象的內部、邊界、外部形成相交、相等、相離的空間位置關系。PostGIS依據OGCSFS擴展了DE-9IM作為空間拓撲關系表達的基礎,同時,根據OGCSFS定義的空間關系謂詞,PostGIS提供了以下空間關系判定的函數(如表1所示)。

表1:PostGIS空間關系判定函數
本文所采用的空間查詢優化方法是通過Python編程語言,通過Python multiprocessing package以支持SQL查詢的并行操作,并加載PostgreSQL數據庫適配模塊Psycopg2實現的。在空間查詢優化并行計算方法實踐中,采用對圖層間DE-9IM拓撲結構分析為例,返回結果記錄數量基于空間索引構建空間連接的表比較來估計。首先,計算空間查詢分析所涉及的所有對象記錄條數,平均分配至各參與計算線程數,以此確定單個分析線程處理的數據量。然后,通過空間索引建立表與表之間的邏輯測試,獲取參與查詢分析的記錄數量,將其平均分配至參與計算的所有進程中執行空間關系判定函數運算。計算結果以數據列表形式存儲于變量中用以輸出。并行計算方法流程圖如圖2所示。

圖2:并行計算方法流程圖
為完整的測試PostgreSQL/PostGIS空間查詢分析性能,選取不同空間尺度的點、線、面數據:上海市閔行區、上海市、長三角地區、中國行政區劃全域,數據來源于全國地理信息資源目錄服務系統(https://www.webmap.cn/)、地理空間數據云(http://www.gscloud.cn/)以及OpenStreetMap(https://www.openstreetmap.org/),以此構建了四個量級的數據庫,數據庫結構如表2所示。

表2:空間查詢優化實例數據庫結構
搭建的空間查詢優化并行計算方法測試環境是裝載Microsoft Windows 10(64位)操作系統的臺式計算機上實現的。硬件配置信息如表3所示。

表3:測試環境硬件配置信息
本文構建的基于并行計算的空間查詢優化方法是對存儲在四個不同量級開源空間數據庫中的三種類型空間數據進行空間拓撲關系判定查詢作為實例進行分析的。在實際運行過程中,對選取的空間數據類型進行組合,組合關系如表4所示。

表4:空間數據查詢類型組合
通過并行計算執行優化查詢方法,單線程與多線程的執行時間記錄從查詢開始到以滿足特定空間關系的對象數(即統計計數)獲得返回結果為止。在執行過程中沒有考慮在數據庫中記錄分析結果可能花費的時間,但分析結果必須記錄在一個線程中。表5所示基于單線程和多線程空間查詢返回結果時間,在多線程處理的情況下,構建空間索引與向各線程平均分配執行查詢任務的時間也記錄在內。

表5:并行計算空間數據查詢實例分析結果
將使用4個線程與單線程執行的空間關系判定查詢的性能分析結果的比率作為執行查詢效率分析評價的依據,若該比率趨近于0則表明采用多線程的方法執行查詢的效率比單線程高;反之,若該比率趨近于1則表明采用多線程的方法執行查詢的效率比單線程低。圖3以柱狀圖的形式說明了各空間數據類型組合由并行計算空間數據查詢實例效率的結果,總體趨勢上來說,與單線程處理相比使用多線程時空間查詢的性能增加。

圖3:并行計算空間數據查詢比率分析結果
圖3中所反映出的空間查詢執行效率可以得出,空間查詢性能的增長于數據庫量級大小并非完全呈線性關系,這種非線性增長是由于在觸發并行計算執行查詢任務時,每個線程直接所分配的任務不均造成的。另外,執行空間查詢分析的空間數據類型不是同質的也造成這一現象的原因;空間數據結構復雜,作為對象的簇被分配給某個計算線程時,導致該線程承受較大的負載。實現該并行計算的限制是可用于在Python變量中存儲結果的RAM容量,如果SQL查詢得到的結果大于可用RAM容量,則查詢分析效率會因內存與磁盤的交換而明顯降低。
本文提出了一種使用Python編程語言實現PostgreSQL/PostGIS開源數據庫進行空間關系分析的多線程顯著提升空間查詢分析性能的優化方法。實例測試結果表明,與單線程處理相比并行計算的空間查詢分析性能明顯提升,且空間查詢分析性能與參與并行計算的線程數并非呈完全線性相關關系;另一層面,隨著分析中使用空間數據量級的增加,空間查詢性能也相應的提高。在空間查詢并行計算優化方法執行中,如何更精準的分配每個線程承載計算的數據量是進一步提升空間查詢性能的關鍵因素。
對于空間數據Shapefile文件格式是空間數據的存儲和交互的標準方式,但Shapefile作為平面文件需要專業的應用應用程序才能讀寫且不支持并發操作。而空間數據庫系統采用SQL語句對空間數據進行查詢、分析、修改等操作,同時支持并發操作以滿足提升空間數據處理效率及異步訪問的問題,在進行復雜的空間查詢和對大型數據集數據處理時,更凸顯了空間數據庫比平面文件的優越之處。在此基礎上,PostgreSQL/PostGIS空間數據庫平臺以開源的特性極大滿足了用戶在空間數據分析處理中的需求,并行計算的優化將進一步提升其空間查詢性能,使其在空間數據管理、空間位置服務、GIS應用系統開發等落地實踐中得以廣泛應用。