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