【问题标题】:Why PHP Allowed memory size of 134217728 bytes exhausted?为什么 PHP 允许 134217728 字节的内存大小用尽?
【发布时间】:2015-09-23 04:00:29
【问题描述】:

我正在检查 CodeEval 中的一些问题,并在 PHP 中遇到了这个奇怪的错误。我没有在其他语言中遇到过这样的事情,所以我不知道为什么会发生这种情况。如果不包括整个答案(请不要帮我找到解决方案,除了为什么 PHP 会这样做),这就是我遇到问题的地方:

for ($j = 0; $j < count($beauty); $j++) {
        $temp = $beauty[$j];
        $beauty[$j] = $beauty[$j+1];
        $beauty[$j+1] = $temp;      
    }

基本上我已经计算了每个字母的数量,现在我将对包含这些值的数组进行排序,以便确定字符串的“美”。奇怪的是我得到了错误:

允许的内存大小为 134217728 字节已用尽

运行上述代码块时。更奇怪的是,当我在 for 循环中取出最后一行时,我不再收到错误了。

for ($j = 0; $j < count($beauty); $j++) {
        $temp = $beauty[$j];
        $beauty[$j] = $beauty[$j+1];
    }

可以正常工作,但我无法那样解决问题。我在想也许有一些奇怪的事情,比如 PHP 通过引用传递数组中的值,或者通过引用传递一般变量的值,这可能会导致问题,但我认为情况并非如此。我不明白为什么将以下数组位置的值设置为我存储在 $temp 中的值会导致程序占用那么多内存。本例中的循环仅适用于计数为 19 的数组。我无法想象 19 个整数如何占用 128Mb 的内存空间,即使我们在每次传递时都进行交换。

有人知道为什么会这样吗?

【问题讨论】:

    标签: php arrays algorithm sorting memory


    【解决方案1】:

    你在这一行创建了一个无限循环:

    $beauty[$j+1] = $temp;

    因为在 $beauty 循环的每次迭代中,您都在添加一个新元素,您的循环永远不会完成

    【讨论】:

    • 是的,大约两分钟前刚到那里。其他语言会这样做吗?我不认为这是所有人的行为。
    • 我想不出任何没有这种行为的语言。您可以通过在循环上方的某处分配 $count = count($beauty); 然后在循环中使用 $count 来避免此问题,以避免在每次迭代时重新计算数组大小。不是一个设计得很好的应用程序,但它可以解决这个问题
    • 是的,出于某种原因,我认为 javascript 没有这样做,但我只是在测试,它确实做到了。
    猜你喜欢
    • 2017-08-26
    • 2012-08-29
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多