【问题标题】:Fastest approach for geopandas (reading and spatialJoin)geopandas 的最快方法(阅读和空间连接)
【发布时间】:2016-10-27 08:09:53
【问题描述】:

我有大约一百万行附加了纬度和经度的数据,而且还会有更多。即使现在从 SQLite 文件中读取数据(我用 pandas 读取它,然后为每一行创建一个点)也需要很多时间。

现在,我需要在这些点上建立一个空间联合,以获得每个点的邮政编码,我真的想优化这个过程。

所以我想知道:是否有任何相对简单的方法可以并行化这些计算?

【问题讨论】:

    标签: python multithreading pandas geopandas


    【解决方案1】:

    我假设您已经实施了 GeoPandas 并且仍然遇到困难? 您可以通过进一步散列您的坐标数据来改善这一点。类似于谷歌如何散列他们的搜索数据。一些数据库已经为这些类型的操作提供了支持(例如 mongodb)。想象一下,如果您取坐标的第一个(左)数字,并将每组对应的数据放入一个单独的 sqlite 文件中。每个数字都可以是指向要查找的正确文件的哈希。现在您的查找时间已经提高了 20 倍 (range(-9,10)),假设您的哈希查找时间比较短

    【讨论】:

    • 是的,我正在使用带有 rtree 的 geopandas。感谢您分享散列 - 这听起来不错。然而,问题是,我可以访问一组机器,并将其用于其他计算 - 但是,我意识到我不知道如何在 pandas 中实现并行化。我应该将数据帧拆分为生成器并在简单的 mp.pool 中运行任务吗?
    • 我不知道数据库查找/加入过程的并行化过程。要实现我的建议,请创建一个包含键范围(-9,10)和指向包含相应数据的文件的值的字典。通过这种方式查找正确的数字,您必须查看更少的数据,因此也可以更快地进行连接
    【解决方案2】:

    事实证明,就我而言,最方便的解决方案是使用带有特定 chunksize 参数的 pandas.read_SQL 函数。在这种情况下,它返回一个数据块的生成器,可以有效地将其与作业一起提供给 mp.Pool().map(); 在这个(我的)案例中,工作包括 1)读取地理边界,2)块的空间关节 3)将块写入数据库。

    【讨论】:

    • 更新:现在有 Dask-Geopandas 的原始测试版,理论上可以自动并行化所有内容
    【解决方案3】:

    此方法完全依赖您的空间尺度,但您可以并行化连接的一种方法是将多边形细分为子多边形,然后将工作卸载到单独核心中的单独线程。这个geopandas r-tree 教程演示了该技术,将一个大多边形细分为许多小多边形,并用大量点与每个小多边形相交。但同样,这仅在您的空间比例合适时才有效:即,几个多边形和很多点(例如几个邮政编码多边形和它们内部和周围的数百万个点)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-19
      • 2016-12-03
      • 2010-10-25
      • 2022-01-09
      相关资源
      最近更新 更多