尝试创建大数组时PHP的问题

时间:2010-02-22 20:23:41

标签: php memory arrays

这是我的代码,它创建了填充零的二维数组,数组维度为(795,6942):

function zeros($rowCount, $colCount){
    $matrix = array();
    for ($rowIndx=0; $rowIndx<$rowCount; $rowIndx++){
        $matrix[] = array();
        for($colIndx=0; $colIndx<$colCount; $colIndx++){
            $matrix[$rowIndx][$colIndx]=0;
        }
    }
    return $matrix;
}

$matrix = zeros(795,6942);

以下是我收到的错误:

Allowed memory size of 134217728 bytes exhausted (tried to allocate 35 bytes)

任何想法如何解决这个问题?

3 个答案:

答案 0 :(得分:29)

作为一个快速计算,您正在尝试创建一个包含以下内容的数组:

795*6942 = 5,518,890

整数。

如果我们认为一个整数存储在4个字节(即32位;使用PHP,它不能少),则意味着:

5518890*4 = 22,075,560

字节。

好的,快速计算...结果是“它应该没问题”。

但事情并不那么容易,不幸的是:-(
我认为这与数据是由PHP使用内部数据结构存储的事实相关,内部数据结构比普通的32位整数复杂得多


现在,只是好奇,让我们修改你的函数,以便输出在每个外部for - 循环的末尾使用了多少内存:

function zeros($rowCount, $colCount){
    $matrix = array();
    for ($rowIndx=0; $rowIndx<$rowCount; $rowIndx++){
        $matrix[] = array();
        for($colIndx=0; $colIndx<$colCount; $colIndx++){
            $matrix[$rowIndx][$colIndx]=0;
        }
        var_dump(memory_get_usage());
    }
    return $matrix;
}

有了这个,我得到了这种输出(64位系统上的PHP 5.3.2-dev; memory_limit设置为128MB - 这已经很多了! )

int 1631968
int 2641888
int 3651808
...
...
int 132924168
int 133934088
Fatal error: Allowed memory size of 134217728 bytes exhausted

这意味着外部for - 循环的每次迭代都需要1.5 MB的内存 - 而且在脚本耗尽内存之前我只能进行131次迭代;而不是像你想要的那样765。

考虑到您将memory_limit设置为128M,您必须将其设置为更高的值 - 例如

128*(765/131) = 747 MB

嗯,即使是

ini_set('memory_limit', '750M');

它仍然不够......使用800MB,似乎已经足够了; - )


但我绝对不建议将memory_limit设置为如此高的值!

(如果你有2GB的RAM,你的服务器将无法处理超过2个并发用户^^ ;;如果我的计算机有2GB的RAM,我实际上不会测试这个,说实话)


我在这里看到的唯一解决方案是让你重新思考你的设计:除了使用这部分代码之外,还有别的东西可以做: - )

(顺便说一句:也许“重新思考你的设计”意味着使用另一种语言PHP:PHP在开发网站方面很棒,但不适合各种问题) < / p>

答案 1 :(得分:5)

默认的PHP数组实现非常占用大量内存。如果你只是存储整数(以及很多整数),你可能想看看SplFixedArray。与传统的哈希结构相反,它使用常规的连续内存块来存储数据。

答案 2 :(得分:1)

您应该尝试增加PHP可用的内存量:

ini_set('memory_limit', '32M');

在PHP文件中。