• (数据科学学习手札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数据分块策略优化等,待它们稳定之后我会另外发文为大家介绍😉。


      以上就是本文的全部内容,欢迎在评论区与我进行讨论~

  • 相关阅读:
    git提交三板斧(如何把项目代码提交到gitee上——命令行版)
    Worthington过氧化物酶活性的6种测定方法
    粘包和半包问题及解决办法
    运行 Node.js 与浏览器 JavaScript
    BSAD检验比特币泡沫生成的时间点
    Fragment使用总结
    深度学习入门(四十七)计算机视觉——SSD和YOLO简介
    Scala语言使用Selenium库编写网络爬虫
    计算机毕设 SpringBoot+Vue幼儿园管理系统 幼儿园信息管理系统 智慧幼儿园管理系统Java Vue MySQL数据库 远程调试 代码讲解
    2023-09-28 monetdb-databae的概念和作用-分析
  • 原文地址:https://www.cnblogs.com/feffery/p/17231708.html