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

費弗裡發表於2023-03-18

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

1 簡介

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

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

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

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
(資料科學學習手札150)基於dask對geopandas進行並行加速

  在此基礎上,後續執行各種運算都需要在程式碼末尾銜接.compute(),從而真正執行前面編排好的運算邏輯,以非向量和向量運算分別為例:

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

2.2 效能比較

  既然使用了dask-geopandas就是奔著其針對大型資料集的計算最佳化而去的,我們來比較一下其與原生geopandas在常見GIS計算任務下的效能表現,可以看到,在與geopandas的計算比較中,dask-geopandas取得了約3倍的計算效能提升,且這種提升幅度會隨著資料集規模的增加而愈發明顯,因為dask可以很好的處理記憶體緊張時的計算最佳化:

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

  當然,這並不代表我們可以在任何場景下用dask-geopandas代替geopandas,在常規的中小型資料集上dask-geopandas反而要慢一些,因為徒增了額外的分塊排程消耗。

  除了上述的內容外,dask-geopandas還有一些實驗性質的功能,如基於地理空間分佈的spatial_partitions資料分塊策略最佳化等,待它們穩定之後我會另外發文為大家介紹?。


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

相關文章