我制作了一个脚本,它几乎从mysql数据库加载一个庞大的对象数组,然后从同一个mysql数据库中加载一个巨大(但较小)的对象列表。
我想使用PHP对每个列表进行迭代,以检查是否存在不规则行为。但每次我运行脚本都需要很长时间才能执行(到目前为止,我还没有看到它完成)。我有没有什么优化可以让它不需要这么长时间来执行。。。?第一个列表中大约有64150个条目,第二个列表中约有1748个条目。
这就是伪代码中的代码通常的样子。
// an array of size 64000 containing objects in the form of {"id": 1, "unique_id": "kqiweyu21a)_"}
$items_list = [];
// an array of size 5000 containing objects in the form of {"inventory: "a long string that might have the unique_id", "name": "SomeName", id": 1};
$user_list = [];
到目前为止,结果是即时的。。。但当我这样做的时候,执行起来需要很长时间,似乎永远不会结束。。。
foreach($items_list as $item)
{
foreach($user_list as $user)
{
if(strpos($user["inventory"], $item["unique_id"]) !== false)
{
echo("Found a version of the item");
}
}
}
请注意,回声应该很少发生。。。。问题不在于MySQL,因为$items_list和$user_list数组几乎立即填充。。只有当我尝试迭代列表时,它才会开始花费很长时间。。。
对于130M次迭代,添加中断将有所帮助,尽管这种情况很少发生。。。
foreach($items_list as $item)
{
foreach($user_list as $user)
{
if(strpos($user["inventory"], $item["unique_id"])){
echo("Found a version of the item");
break;
}
}
}
PHP 5.6的替代解决方案1:您也可以使用PTHREADS,并将您的大数组分割成块,将它们集中到线程中。。。有了休息,这肯定会改善它。
备选解决方案2:使用PHP7,阵列操作和循环的性能改进很大。
还要尝试在循环之前对数组进行排序。这取决于您所看到的内容,但通常情况下,如果找到条件,在数组之前排序会尽可能限制循环时间。
您的示例几乎不可能重现。您需要提供一个可以复制的例子,即如果只访问一个数组,那么两个循环将非常快地完成,即1-2秒。这意味着你搜索的字符串是千字节或更大(没有问题),或者在循环运行时发生了其他事情,即数据库访问或类似的事情。
您可以让SQL为您进行搜索。既然你不分享你需要的专栏,我就只拉我看到的那些。
SELECT i.unique_id, u.inventory
FROM items i, users u
WHERE LOCATE(i.unique_id, u inventory)