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
反而要慢一些,因为徒增了额外的分块调度消耗。