本文示例程式碼已上傳至我的
Github
倉庫https://github.com/CNFeffery/DataScienceStudyNotes
1 簡介
大家好我是費老師,geopandas
作為我們非常熟悉的Python GIS
利器,兼顧著高效能和易用性,特別是在其0.12.0
版本開始使用全新的shapely
2.0向量計算後端後,效能表現更是一路狂飆。
而我們作為使用者,當然是希望geopandas
處理分析向量資料越快越好。在今天的文章中,我將為大家簡要介紹如何基於dask
對geopandas
進一步提速,從而更從容的應對更大規模的GIS
分析計算任務。
2 dask-geopandas的使用
很多朋友應該聽說過dask
,它是Python
生態裡非常知名的高效能運算框架,可以針對大型陣列、資料框及機器學習模型進行平行計算排程最佳化,而dask-geopandas
就是由geopandas
團隊研發的,基於dask
對GeoDataFrame
進行平行計算最佳化的框架,本質上是對dask
和geopandas
的封裝整合。
dask-geopandas
的安裝非常簡單,在已經安裝了geopandas
的虛擬環境中,執行下列命令即可:
conda install dask-geopandas -c conda-forge -y
2.1 基礎使用
dask-geopandas
與geopandas
的常用計算API是相通的,但呼叫方式略有不同,舉一個實際例子,其中示例檔案demo_points.gdb
由以下程式碼隨機生成並寫出:
import numpy as np
import geopandas as gpd
from shapely import Point, Polygon
# 生成示例用向量資料
demo_points = gpd.GeoDataFrame(
{
'id': range(1000000),
'geometry': [
Point(np.random.uniform(0, 90),
np.random.uniform(0, 90))
for i in range(1000000)
]
}
)
# 寫出到本地gdb
demo_points.to_file('./demo_points.gdb', driver='OpenFileGDB')
在使用dask-geopandas
時,我們首先還是需要用geopandas
進行目標資料的讀入,再使用from_geopandas()
將其轉換為dask-geopandas
中可以直接操作的資料框物件,其中引數npartitions
用於將原始資料集劃分為n個資料塊,理論上分割槽越多並行運算速度越快,但受限於機器的CPU瓶頸,通常建議設定npartitions
為機器可排程的CPU核心數:
demo_points = gpd.read_file('./demo_points.gdb', driver='OpenFileGDB')
demo_points_ddf = dgpd.from_geopandas(demo_points, npartitions=4)
demo_points_ddf
在此基礎上,後續執行各種運算都需要在程式碼末尾銜接.compute()
,從而真正執行前面編排好的運算邏輯,以非向量和向量運算分別為例:
2.2 效能比較
既然使用了dask-geopandas
就是奔著其針對大型資料集的計算最佳化而去的,我們來比較一下其與原生geopandas
在常見GIS
計算任務下的效能表現,可以看到,在與geopandas
的計算比較中,dask-geopandas
取得了約3倍的計算效能提升,且這種提升幅度會隨著資料集規模的增加而愈發明顯,因為dask
可以很好的處理記憶體緊張時的計算最佳化:
當然,這並不代表我們可以在任何場景下用dask-geopandas
代替geopandas
,在常規的中小型資料集上dask-geopandas
反而要慢一些,因為徒增了額外的分塊排程消耗。
除了上述的內容外,dask-geopandas
還有一些實驗性質的功能,如基於地理空間分佈的spatial_partitions
資料分塊策略最佳化等,待它們穩定之後我會另外發文為大家介紹?。
以上就是本文的全部內容,歡迎在評論區與我進行討論~