PHP大大加快了我脚本的执行时间

时间:2014-04-22 08:48:02

标签: php arrays

我有一个沉重的脚本,我们运行充足。以下是使用的算法:

  1. 从数据库加载4500行并将其存储为数组。 (A)

  2. 从数据库加载600000行并将其存储为数组。 (B)

  3. 对于(A)中的每个元素,在(B)中查找匹配。

  4. 转到(A)

  5. 中的下一个元素

    因此,此脚本的最大迭代次数为4500 * 60 000,即270,000,000,因此您可以理解这对于PHP来说可能有些出汗。

    我能以某种方式提高这个过程的效率吗? 从数据库中读取行并不是一个问题,因为数组迭代会带来沉​​重的成本。

    它确实工作得非常快,但在未来几年中,一个因素(60000)会大大增加。

    所有想法?

2 个答案:

答案 0 :(得分:1)

以下是一些不同的答案。我的猜测是第一个是正确的, 简单而且充足,但很难确定。

可能的答案1:使用SQL

正如评论所表明的那样听起来非常像一个加入。另外你的帖子似乎 表示您只在找到匹配时才执行操作,而不是每个元素 在A中有一场比赛。这意味着您的SQL语句应该只返回匹配的行,而不是 他们都是。如果你可以放手,你无法做我所做的一切都没关系 为您整理数据。

可能的答案2:对数组进行排序

也许您可以对数组进行排序(再次,最好让您的数据库执行此操作)。可能是你 可以对B进行排序,以便更快地搜索匹配。或者将搜索值放在关键字中 数组,以便搜索非常快。或者如果你很幸运,你可以对两者进行排序 数组的方式使得所有A和B的顺序相同。即对于任何A你选择你 知道正确的B要么不存在,要么在B数组中稍后存在。

可能的答案3:解释有关问题的更多信息

您只向我们提供了您当前的算法,而不是您实际尝试的算法。最 可能迭代一切并不是最好的主意,但除非他们知道,否则没有人可以说 更多关于您的数据以及您最终想要做的事情。

答案 1 :(得分:1)

这取决于您的数据,当然......

一些一般方面:

  • 这听起来像是数据库查询的用例,而不是php脚本。在数据集中寻找匹配是数据库擅长的,即使在同一个联盟中也没有技巧可以让PHP脚本发挥作用
  • 如果你真的必须使用php脚本函数试试

    • 不要达到允许的内存限制。你的php服务器只会退出并出现错误,但是如果你的sql站点结果集太大,你的sql server可能会开始将临时数据写入hd,这将减慢整个执行时间 - >如果可能,以块(偏移,限制)获取和处理数据
    • 如果您匹配整个单词,请以这种方式构建匹配的数组,搜索条件是键,而不是值,以便您可以使用isset($potentialMatches[$searchTerm]),这比{更快} {1}}用于较大的数组。样机:

      while($ row = $ resultSet-> fetch_assoc()){ $ potentialMatches [$ row [' search_column']] = $ row; }


但它不够强调:处理这个问题的通常做法是:

  1. 执行匹配的DB端
  2. 处理脚本中的匹配项
  3. 如有必要:为非匹配项执行新查询
  4. if 3.,在脚本中处理这些结果