本文示例代碼已上傳至我的
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
數據分塊策略優化等,待它們穩定之後我會另外發文爲大家介紹😉。
以上就是本文的全部內容,歡迎在評論區與我進行討論~