while循环中的php性能问题

飞行前移除

我使用PHP处理纬度/经度点,以便生成JS并在OSM地图上显示点。当我在录音中停留au 10分钟或更长时间时,我想在地图上制作一条新曲目。

我的数据集目前在大约10条不同的轨道上记录了大约30000条记录(一些轨道大约有300点,另一些轨道有数千点)。

我遇到PHP的性能问题。当循环聚集数百个点时,数据将以良好的速度进行处理,但是如果轨道具有数千个点,则性能会急剧下降。

这是进行每个曲目的每个点所需的时间

+-----------------+------------------------------+
| Points On Track | Time To Proceed 10000 Points |
+-----------------+------------------------------+
|              21 | 0.75                         |
|           18865 | 14.52                        |
|             539 | 0.79                         |
|             395 | 0.71                         |
|             827 | 0.79                         |
|             400 | 0.74                         |
|             674 | 0.78                         |
|            2060 | 1.01                         |
|            2056 | 0.99                         |
|             477 | 0.73                         |
|             628 | 0.77                         |
|             472 | 0.73                         |
+-----------------+------------------------------+

我们可以看到,当我在赛道上有很多要点时,表演会急剧下降。在这种特殊情况下,处理所有点大约需要30秒。如果我将每个音轨的点数限制为500点,那么性能会非常好(大约需要2.5秒来进行数据设置)。

我将Synology DS415play用作网络服务器。

这是我的代码:

$dataTab = array();
if ($result = $mysqli->query($sql)) 
    {   
        $count = 0;

        $row = $result->fetch_array();
        $data = $dataTab[$tabPrt] . "[" . $row['latitude'] . "," . $row['longitude'] . "]," ;
        $date = new DateTime($row['time']);         

        while($row = $result->fetch_array())
        {
            $count++;

            $newDate = new DateTime($row['time']);
            if(($newDate->getTimestamp() - $date->getTimestamp()) > 600)
            {
                array_push($dataTab, $data);
                $data= "";
                $count = 0;
            }

            $data = $data . "[" . $row['latitude'] . "," . $row['longitude'] . "]," ;
            $date = $newDate;
        }
        array_push($dataTab, $data);
    }

如果我将每个曲目限制在500点之内,那么性能会非常好

$dataTab = array();
    if ($result = $mysqli->query($sql)) 
        {   
            $count = 0;

            $row = $result->fetch_array();
            $data = $dataTab[$tabPrt] . "[" . $row['latitude'] . "," . $row['longitude'] . "]," ;
            $date = new DateTime($row['time']);         

            while($row = $result->fetch_array())
            {
                $count++;

                $newDate = new DateTime($row['time']);
                if(($newDate->getTimestamp() - $date->getTimestamp()) > 600  
                    || $count > 500)
                {
                    array_push($dataTab, $data);
                    $data= "";
                    $count = 0;
                }

                $data = $data . "[" . $row['latitude'] . "," . $row['longitude'] . "]," ;
                $date = $newDate;
            }
            array_push($dataTab, $data);
        }

谢谢

编辑:我在这里提供数据示例:http : //109.190.92.126/tracker/gpsData.sql慢速脚本:http : //109.190.92.126/tracker/map.php通过分割每个轨道,正常执行速度(最大500 pts ):http//109.190.92.126/tracker/map_split.php

谢谢

帕尔马

这是最终产品(在Heroku上,因此请等待dyno启动)http://sove.herokuapp.com/gps/

解决方案背后的思想是在服务器端计算时间戳的差异,并处理数组中的数据。

该脚本在我的MBP上以0.278s完成,占用了15.75MB的内存,最终输出$ts是一组路由(我总共得到7条路由)。

有很多优化,包括跳过相同的坐标点。缩放范围在地图上不正确,但您会弄清楚。我真的应该为此工作赏金。如果您喜欢结果,请告诉我,我可以共享代码库。

资料来源:https : //gist.github.com/jpaljasma/04f54e0d2fa3a632071e

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章