geopandas 的最快方法(读取和 spatialJoin)
Fastest approach for geopandas (reading and spatialJoin)
我有大约一百万行附加了纬度和经度的数据,以后还会有更多。即使现在从 SQLite 文件中读取数据(我用 pandas 读取它,然后为每一行创建一个点)也需要很多时间。
现在,我需要对这些点进行空间连接,以便为每个点获取邮政编码,我真的很想优化这个过程。
所以我想知道:是否有任何相对简单的方法来并行化这些计算?
我假设您已经实施了 GeoPandas,但仍然遇到困难?
您可以通过进一步散列坐标数据来改进这一点。类似于 google 散列其搜索数据的方式。一些数据库已经提供了对这些类型操作的支持(例如mongodb)。想象一下,如果您获取坐标的第一个(左)数字,并将每组对应的数据放入一个单独的 sqlite 文件中。每个数字都可以是指向要查找的正确文件的散列。现在您的查找时间提高了 20 倍 (range(-9,10)
),假设相比之下您的哈希查找花费的时间最短
事实证明,对我来说最方便的解决方案是使用具有特定 chunksize 参数的 pandas.read_SQL 函数。在这种情况下,它 returns 是数据块的生成器,可以与作业一起有效地提供给 mp.Pool().map();
在这个(我的)案例中,工作包括 1) 读取地理边界,2) 块的空间连接 3) 将块写入数据库。
此方法完全依赖于您的空间尺度,但是您可以并行化连接的一种方法是将多边形细分为子多边形,然后卸载工作以在单独的核心。本 geopandas r-tree 教程演示了该技术,将一个大多边形细分为许多小多边形,并使每个小多边形与大量点相交。但同样,这仅在您的空间比例合适时才有效:即,几个多边形和很多点(例如几个邮政编码多边形和它们内部和周围的数百万个点)。
我有大约一百万行附加了纬度和经度的数据,以后还会有更多。即使现在从 SQLite 文件中读取数据(我用 pandas 读取它,然后为每一行创建一个点)也需要很多时间。
现在,我需要对这些点进行空间连接,以便为每个点获取邮政编码,我真的很想优化这个过程。
所以我想知道:是否有任何相对简单的方法来并行化这些计算?
我假设您已经实施了 GeoPandas,但仍然遇到困难?
您可以通过进一步散列坐标数据来改进这一点。类似于 google 散列其搜索数据的方式。一些数据库已经提供了对这些类型操作的支持(例如mongodb)。想象一下,如果您获取坐标的第一个(左)数字,并将每组对应的数据放入一个单独的 sqlite 文件中。每个数字都可以是指向要查找的正确文件的散列。现在您的查找时间提高了 20 倍 (range(-9,10)
),假设相比之下您的哈希查找花费的时间最短
事实证明,对我来说最方便的解决方案是使用具有特定 chunksize 参数的 pandas.read_SQL 函数。在这种情况下,它 returns 是数据块的生成器,可以与作业一起有效地提供给 mp.Pool().map(); 在这个(我的)案例中,工作包括 1) 读取地理边界,2) 块的空间连接 3) 将块写入数据库。
此方法完全依赖于您的空间尺度,但是您可以并行化连接的一种方法是将多边形细分为子多边形,然后卸载工作以在单独的核心。本 geopandas r-tree 教程演示了该技术,将一个大多边形细分为许多小多边形,并使每个小多边形与大量点相交。但同样,这仅在您的空间比例合适时才有效:即,几个多边形和很多点(例如几个邮政编码多边形和它们内部和周围的数百万个点)。