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