【问题标题】:handling large arrays with array_diff使用 array_diff 处理大型数组
【发布时间】:2011-02-28 11:19:43
【问题描述】:

我一直在尝试比较两个数组。使用 array_intersect 没有问题。当使用 array_diff 和具有 ~5,000 个值的数组时,它可以工作。当我达到约 10,000 个值时,当我到达 array_diff 时脚本就会死掉。开启 error_reporting 并没有产生任何结果。

我尝试创建自己的 array_diff 函数:

function manual_array_diff($arraya, $arrayb) {
    foreach ($arraya as $keya => $valuea) {
        if (in_array($valuea, $arrayb)) {
            unset($arraya[$keya]);
        }
    }
    return $arraya;
}

来源:How does array_diff work?

我希望它比官方的 array_diff 效率低,但它可以处理约 10,000 个数组。不幸的是,当我达到 ~15,000 时,两个 array_diffs 都失败了。

我在另一台机器上尝试了相同的代码,它运行良好,所以这不是代码或 PHP 的问题。该特定服务器上的某处必须设置一些限制。知道如何绕过这个限制或改变它,或者只是找出它是什么?

【问题讨论】:

  • 你用什么数据测试过?
  • 可能是因为这个算法是O(N^2)。
  • 你是在浏览器还是命令行中运行这个?
  • 数据是一堆ID。在浏览器中运行它。

标签: php


【解决方案1】:

遇到了完全相同的问题,我真的希望在这里得到答案。

因此,我必须找到自己的解决方法,并想出以下丑陋的组合,它对我有用,包含大约 50,000 个元素的数组。根据您的观察,array_intersect 有效,但 array_diff 无效。

这迟早也会溢出资源限制,在这种情况下,需要对数组进行分块并处理较小的位。当我们到达时,我们将穿过那座桥。

function new_array_diff($arraya, $arrayb) {
    $intersection = array_intersect($arraya, $arrayb);
    foreach ($arraya as $keya => $valuea) {
        if (!isset($intersection[$keya])) {
            $diff[$keya] = $valuea;
        }
    }

    return $diff;
}

【讨论】:

    【解决方案2】:

    在我的 php.ini 中:

    max_execution_time = 60     ; Maximum execution time of each script, in seconds
    memory_limit = 32M          ; Maximum amount of memory a script may consume
    

    这些设置或机器性能的差异是否会导致问题?您是否检查了您的网络服务器错误日志(如果您通过一个运行此日志)?

    【讨论】:

    • 执行只需要几秒钟,所以执行时间不是问题。在一台机器上手动降低 memory_limit 确实杀死了脚本。但是,在另一台机器上将 memory_limit 设置得更高并没有解决问题。如果您好奇的话,最初是 40M 在导致问题的机器上。
    【解决方案3】:

    您提到这是在浏览器中运行的。尝试通过命令行运行脚本,看看结果是否不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-17
      • 1970-01-01
      • 1970-01-01
      • 2018-04-23
      • 2018-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多