【发布时间】:2013-12-03 19:57:12
【问题描述】:
我在服务器上安装了 Nominatim(带有开放的街道地图)。
在另一台服务器上,我有一个包含多列的数据库,其中 3 列是纬度(纬度)、经度(经度)和地址。 lat 和 lon 列用坐标完成,对于第三列,我用 PHP 编写了一个脚本,它查询 Nominatim(在另一台服务器上)以获取坐标的地址并在运行时更新数据库。目前脚本使用 cUrl(创建像 .../reverse.php?lat=XX&lon=YY 这样的 url),获取输出(一个 xml)并更新数据库。
问题在于,对于 1000 个坐标,大约需要 16 秒。该脚本一直运行 8 个 cUrl 线程,直到完成所有提取。我发现 8 线程是最好的,因为服务器有一个 8 核 CPU。
我想知道是否有更好的解决方案可以更快地获取地址。我正在考虑通过 ssh 运行 exec,甚至将数据库导出到 nominatim 服务器并在那里运行 exec。
在开始写代码之前,我想得到一个意见,所以我不会写几百行代码来得到更糟糕的结果。
【问题讨论】:
-
我无法想象您的地理编码查询受 CPU 限制。请考虑增加服务器的磁盘吞吐量。
-
我正在寻求改进而不更改服务器组件。我可以做些什么更好的(而不是 exec 或 curl)来减少时间?今天早上我用 exec 实现了一个脚本,1000 个坐标大约需要 32 秒,这是我用 cURL 得到的两倍。
-
如果不知道您当前的瓶颈是什么,就无法判断。
-
线程应该不是问题。您可以下载尽可能多的带宽。问题更有可能是挂起的连接。 CURL 会将您的所有 URL 作为一个批次处理,并且在所有 URL 下载完成之前不会移动到下一个批次。要下载并行 URL,请查看 UB 存储库中的 puf 程序。其次,你不能做一些事情来在一个请求中进行多次查找吗?比如:/reverse.php?lat[]=XX&lon[]=YY&lat[]=XX&lon[]=YY&lat[]=XX&lon[]=YY
标签: php mysql curl exec nominatim