gpt4 book ai didi

while循环中的php性能问题

转载 作者:可可西里 更新时间:2023-11-01 12:57:34 25 4
gpt4 key购买 nike

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

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

我遇到了 PHP 的性能问题。当循环聚合数百个点时,数据处理速度很快,但如果轨道有数千个点,性能会急剧下降。

这里是每条track的每一个point所需要的时间

+-----------------+------------------------------+
| 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 点):http://109.190.92.126/tracker/map_split.php

谢谢

最佳答案

如果您在最坏的情况下从数据库中获取 18000 条记录,您可以将时间戳检查移到查询中以大大减少它,看起来您所做的只是查看是否有十分钟的间隔然后推送到一个可以在 mysql 级别完成的数组,这样你就不会每次都从数据库中获取 18000 行,只是你需要的那些。

如果您发布您的 mysql 查询,我们可以考虑将其放入其中。

编辑:尝试将查询更改为:

SELECT time, latitude, longitude 
FROM gpsData
WHERE time >= '2015-09-01'
AND provider = 'gps'
ORDER BY time DESC

关于while循环中的php性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33268362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com