(數據科學學習手札150)基於dask對geopandas進行並行加速

本文示例代碼已上傳至我的Github倉庫https://github.com/CNFeffery/DataScienceStudyNotes

1 簡介

  大家好我是費老師,geopandas作爲我們非常熟悉的Python GIS利器,兼顧着高性能和易用性,特別是在其0.12.0版本開始使用全新的shapely2.0矢量計算後端後,性能表現更是一路狂飆。

  而我們作爲使用者,當然是希望geopandas處理分析矢量數據越快越好。在今天的文章中,我將爲大家簡要介紹如何基於daskgeopandas進一步提速,從而更從容的應對更大規模的GIS分析計算任務。

2 dask-geopandas的使用

  很多朋友應該聽說過dask,它是Python生態裏非常知名的高性能計算框架,可以針對大型數組、數據框及機器學習模型進行並行計算調度優化,而dask-geopandas就是由geopandas團隊研發的,基於daskGeoDataFrame進行並行計算優化的框架,本質上是對daskgeopandas的封裝整合。

  dask-geopandas的安裝非常簡單,在已經安裝了geopandas的虛擬環境中,執行下列命令即可:

conda install dask-geopandas -c conda-forge -y

2.1 基礎使用

  dask-geopandasgeopandas的常用計算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數據分塊策略優化等,待它們穩定之後我會另外發文爲大家介紹😉。


  以上就是本文的全部內容,歡迎在評論區與我進行討論~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章