田冬迪
(上海師慶科技發(fā)展有限公司 上海市 201103)
“互聯(lián)網(wǎng)+”時代背景下,伴隨著物聯(lián)網(wǎng)、大數(shù)據(jù)、區(qū)塊鏈等技術(shù)概念的發(fā)展和衍變,空間數(shù)據(jù)呈現(xiàn)海量、異構(gòu)、數(shù)據(jù)源眾多[1]、多樣化的趨勢,將其空間位置屬性應(yīng)用于非實時數(shù)據(jù)支撐亦或是實時數(shù)據(jù)應(yīng)用探索[2]以及隱藏空間信息挖掘,商業(yè)價值和社會價值有無限的可能性?;诘乩硇畔⒑涂臻g位置的業(yè)務(wù)系統(tǒng)應(yīng)用隨著各行業(yè)的發(fā)展日益增多,由此形成的空間數(shù)據(jù)需要通過建立空間數(shù)據(jù)庫進(jìn)行高效的存儲、管理、運(yùn)維??臻g數(shù)據(jù)庫是以空間數(shù)據(jù)作為存儲對象的專業(yè)數(shù)據(jù)庫[3],其發(fā)展經(jīng)歷了從平面文件(Flat-file)、關(guān)系數(shù)據(jù)庫(RDBMS)、對象關(guān)系數(shù)據(jù)庫(Object Relational Database)的演變過程[4]??臻g數(shù)據(jù)庫將空間數(shù)據(jù)與對象關(guān)系數(shù)據(jù)庫的集成,真正實現(xiàn)了以GIS為中心向以數(shù)據(jù)庫為中心的轉(zhuǎn)變,同時也為通過SQL語言操作空間數(shù)據(jù)奠定了基礎(chǔ)。PostgreSQL開源數(shù)據(jù)庫以其開源特性和成本優(yōu)勢及可擴(kuò)展的結(jié)構(gòu),并支持PostGIS空間數(shù)據(jù)引擎和空間數(shù)據(jù)模型理論[5],為實現(xiàn)空間數(shù)據(jù)的分析、建模、空間信息挖掘提供了新的技術(shù)路線及方法,在成本、質(zhì)量、可拓展性上優(yōu)于大型商用數(shù)據(jù)庫[6]。在空間查詢分析方面,相較于分布式解決方案,加載PostGIS的PostgreSQL可以通過支持單臺計算機(jī)多線程并行計算的形式優(yōu)化運(yùn)行效率,為空間數(shù)據(jù)查詢分析以及地理信息系統(tǒng)平臺開發(fā)應(yīng)用提供了新的解決方案,同時也拓展了開源生態(tài)鏈并豐富了開源生態(tài)系統(tǒng)。
本文研究探索以點、線、面多元空間要素數(shù)據(jù)為研究對象,借助PostgreSQL加載PostGIS開源數(shù)據(jù)庫引擎建立了不同數(shù)據(jù)量級的空間數(shù)據(jù)庫,通過Python構(gòu)建多線程并行計算的方法,實現(xiàn)對PostgresSQL/PostGIS的空間查詢運(yùn)行效率的優(yōu)化。
PostgreSQL對空間數(shù)據(jù)的存儲、管理及服務(wù)支持是通過PostGIS來實現(xiàn)的,遵循OpenGIS聯(lián)盟(OGC)的規(guī)范,支持的GIS對象是OGC定義的“SimpleFeatures(簡單要素)”標(biāo)準(zhǔn)的超集;同時支持OGC“SimpleFeaturesfor SQL”規(guī)范(SFS)中指定的所有對象和函數(shù),同時也支持"SQL/MM"規(guī)范的幾何對象。PostGIS擴(kuò)展了該標(biāo)準(zhǔn),支持嵌入式SRID信息[7]。在Geometry對空間數(shù)據(jù)的存儲使用了OGC推薦的WKT(Well-Known Text)和WKB(Well-Known Binary)格式表達(dá)集合對象,大幅增加了易用性。PosGIS支持WKT的7個基本空間數(shù)據(jù)類型:Point(點)、Linestring(線)、Polygon(多邊形)、MultiPoint(多點)、MultiLinestring(多線)、MultiPolygon(多多邊形)和Geometry Collection(幾何集合)等??臻g數(shù)據(jù)組織結(jié)構(gòu)圖如圖1所示。
圖1:空間數(shù)據(jù)類型組織結(jié)構(gòu)圖
空間索引的建立為空間數(shù)據(jù)庫對海量空間數(shù)據(jù)集的查詢分析應(yīng)用奠定了基礎(chǔ)。PostgreSQL數(shù)據(jù)庫支持B-Treeindexes、R-Treeindexes和GiST indexes 3種索引。GiST用于廣泛的數(shù)據(jù)結(jié)構(gòu),可加快各種不規(guī)則數(shù)據(jù)結(jié)構(gòu)(整形數(shù)組,光譜數(shù)據(jù)等)的查詢速度,包括空間數(shù)據(jù)。PostGIS是在GiST的基礎(chǔ)上實現(xiàn)R-Tree去索引地理數(shù)據(jù),將數(shù)據(jù)切分為矩形,子矩形,子子矩形等,通過自動處理可變的數(shù)據(jù)密度和對象大小的自協(xié)調(diào)的索引結(jié)構(gòu),極大提高了了構(gòu)建空間連接時表比較的效率。
在構(gòu)造空間查詢優(yōu)化并行計算方法時,需要根據(jù)空間索引對預(yù)選的分析記錄數(shù)進(jìn)行等分,將輸入查詢數(shù)據(jù)分成若干子組,由不同的處理器核進(jìn)行處理,通過并行計算對數(shù)據(jù)集的不同部分調(diào)用相同的SQL查詢來執(zhí)行。由于SQL查詢的并行執(zhí)行,該方法在PostgreSQL/PostGIS數(shù)據(jù)庫空間索引限制的基礎(chǔ)上,計算過程中不需要磁盤寫入操作的情況下選擇數(shù)據(jù)集的特定部分,將SQL查詢結(jié)果以變量的形式返回到不同的數(shù)據(jù)集中,最終組合成一個完整的數(shù)據(jù)集,并保存到單獨文件中的磁盤或參與分析的數(shù)據(jù)庫中。
維數(shù)擴(kuò)展的9交集模型(DE-9IM,The Dimensionally Extended nine-Intersection Model)是用于描述兩個空間對象在空間位置上相互交互的框架,其定義空間對象的內(nèi)部、邊界、外部形成相交、相等、相離的空間位置關(guān)系。PostGIS依據(jù)OGCSFS擴(kuò)展了DE-9IM作為空間拓?fù)潢P(guān)系表達(dá)的基礎(chǔ),同時,根據(jù)OGCSFS定義的空間關(guān)系謂詞,PostGIS提供了以下空間關(guān)系判定的函數(shù)(如表1所示)。
表1:PostGIS空間關(guān)系判定函數(shù)
本文所采用的空間查詢優(yōu)化方法是通過Python編程語言,通過Python multiprocessing package以支持SQL查詢的并行操作,并加載PostgreSQL數(shù)據(jù)庫適配模塊Psycopg2實現(xiàn)的。在空間查詢優(yōu)化并行計算方法實踐中,采用對圖層間DE-9IM拓?fù)浣Y(jié)構(gòu)分析為例,返回結(jié)果記錄數(shù)量基于空間索引構(gòu)建空間連接的表比較來估計。首先,計算空間查詢分析所涉及的所有對象記錄條數(shù),平均分配至各參與計算線程數(shù),以此確定單個分析線程處理的數(shù)據(jù)量。然后,通過空間索引建立表與表之間的邏輯測試,獲取參與查詢分析的記錄數(shù)量,將其平均分配至參與計算的所有進(jìn)程中執(zhí)行空間關(guān)系判定函數(shù)運(yùn)算。計算結(jié)果以數(shù)據(jù)列表形式存儲于變量中用以輸出。并行計算方法流程圖如圖2所示。
圖2:并行計算方法流程圖
為完整的測試PostgreSQL/PostGIS空間查詢分析性能,選取不同空間尺度的點、線、面數(shù)據(jù):上海市閔行區(qū)、上海市、長三角地區(qū)、中國行政區(qū)劃全域,數(shù)據(jù)來源于全國地理信息資源目錄服務(wù)系統(tǒng)(https://www.webmap.cn/)、地理空間數(shù)據(jù)云(http://www.gscloud.cn/)以及OpenStreetMap(https://www.openstreetmap.org/),以此構(gòu)建了四個量級的數(shù)據(jù)庫,數(shù)據(jù)庫結(jié)構(gòu)如表2所示。
表2:空間查詢優(yōu)化實例數(shù)據(jù)庫結(jié)構(gòu)
搭建的空間查詢優(yōu)化并行計算方法測試環(huán)境是裝載Microsoft Windows 10(64位)操作系統(tǒng)的臺式計算機(jī)上實現(xiàn)的。硬件配置信息如表3所示。
表3:測試環(huán)境硬件配置信息
本文構(gòu)建的基于并行計算的空間查詢優(yōu)化方法是對存儲在四個不同量級開源空間數(shù)據(jù)庫中的三種類型空間數(shù)據(jù)進(jìn)行空間拓?fù)潢P(guān)系判定查詢作為實例進(jìn)行分析的。在實際運(yùn)行過程中,對選取的空間數(shù)據(jù)類型進(jìn)行組合,組合關(guān)系如表4所示。
表4:空間數(shù)據(jù)查詢類型組合
通過并行計算執(zhí)行優(yōu)化查詢方法,單線程與多線程的執(zhí)行時間記錄從查詢開始到以滿足特定空間關(guān)系的對象數(shù)(即統(tǒng)計計數(shù))獲得返回結(jié)果為止。在執(zhí)行過程中沒有考慮在數(shù)據(jù)庫中記錄分析結(jié)果可能花費的時間,但分析結(jié)果必須記錄在一個線程中。表5所示基于單線程和多線程空間查詢返回結(jié)果時間,在多線程處理的情況下,構(gòu)建空間索引與向各線程平均分配執(zhí)行查詢?nèi)蝿?wù)的時間也記錄在內(nèi)。
表5:并行計算空間數(shù)據(jù)查詢實例分析結(jié)果
將使用4個線程與單線程執(zhí)行的空間關(guān)系判定查詢的性能分析結(jié)果的比率作為執(zhí)行查詢效率分析評價的依據(jù),若該比率趨近于0則表明采用多線程的方法執(zhí)行查詢的效率比單線程高;反之,若該比率趨近于1則表明采用多線程的方法執(zhí)行查詢的效率比單線程低。圖3以柱狀圖的形式說明了各空間數(shù)據(jù)類型組合由并行計算空間數(shù)據(jù)查詢實例效率的結(jié)果,總體趨勢上來說,與單線程處理相比使用多線程時空間查詢的性能增加。
圖3:并行計算空間數(shù)據(jù)查詢比率分析結(jié)果
圖3中所反映出的空間查詢執(zhí)行效率可以得出,空間查詢性能的增長于數(shù)據(jù)庫量級大小并非完全呈線性關(guān)系,這種非線性增長是由于在觸發(fā)并行計算執(zhí)行查詢?nèi)蝿?wù)時,每個線程直接所分配的任務(wù)不均造成的。另外,執(zhí)行空間查詢分析的空間數(shù)據(jù)類型不是同質(zhì)的也造成這一現(xiàn)象的原因;空間數(shù)據(jù)結(jié)構(gòu)復(fù)雜,作為對象的簇被分配給某個計算線程時,導(dǎo)致該線程承受較大的負(fù)載。實現(xiàn)該并行計算的限制是可用于在Python變量中存儲結(jié)果的RAM容量,如果SQL查詢得到的結(jié)果大于可用RAM容量,則查詢分析效率會因內(nèi)存與磁盤的交換而明顯降低。
本文提出了一種使用Python編程語言實現(xiàn)PostgreSQL/PostGIS開源數(shù)據(jù)庫進(jìn)行空間關(guān)系分析的多線程顯著提升空間查詢分析性能的優(yōu)化方法。實例測試結(jié)果表明,與單線程處理相比并行計算的空間查詢分析性能明顯提升,且空間查詢分析性能與參與并行計算的線程數(shù)并非呈完全線性相關(guān)關(guān)系;另一層面,隨著分析中使用空間數(shù)據(jù)量級的增加,空間查詢性能也相應(yīng)的提高。在空間查詢并行計算優(yōu)化方法執(zhí)行中,如何更精準(zhǔn)的分配每個線程承載計算的數(shù)據(jù)量是進(jìn)一步提升空間查詢性能的關(guān)鍵因素。
對于空間數(shù)據(jù)Shapefile文件格式是空間數(shù)據(jù)的存儲和交互的標(biāo)準(zhǔn)方式,但Shapefile作為平面文件需要專業(yè)的應(yīng)用應(yīng)用程序才能讀寫且不支持并發(fā)操作。而空間數(shù)據(jù)庫系統(tǒng)采用SQL語句對空間數(shù)據(jù)進(jìn)行查詢、分析、修改等操作,同時支持并發(fā)操作以滿足提升空間數(shù)據(jù)處理效率及異步訪問的問題,在進(jìn)行復(fù)雜的空間查詢和對大型數(shù)據(jù)集數(shù)據(jù)處理時,更凸顯了空間數(shù)據(jù)庫比平面文件的優(yōu)越之處。在此基礎(chǔ)上,PostgreSQL/PostGIS空間數(shù)據(jù)庫平臺以開源的特性極大滿足了用戶在空間數(shù)據(jù)分析處理中的需求,并行計算的優(yōu)化將進(jìn)一步提升其空間查詢性能,使其在空間數(shù)據(jù)管理、空間位置服務(wù)、GIS應(yīng)用系統(tǒng)開發(fā)等落地實踐中得以廣泛應(yīng)用。