Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试创建大数组时PHP出现问题_Php_Memory_Arrays - Fatal编程技术网

尝试创建大数组时PHP出现问题

尝试创建大数组时PHP出现问题,php,memory,arrays,Php,Memory,Arrays,这是我的代码,它创建了用零填充的二维数组,数组的维数是(7956942): 有没有办法解决这个问题?您应该尝试增加PHP可用的内存量: ini_set('memory_limit', '32M'); 在PHP文件中。作为快速计算,您正在尝试创建一个包含以下内容的数组: 795*6942 = 5,518,890 整数 如果我们认为一个整数被存储在4个字节(即32个比特上,使用PHP,它就不那么少),这意味着: 5518890*4 = 22,075,560 字节 好的,快速计算。。。结果是“应

这是我的代码,它创建了用零填充的二维数组,数组的维数是(7956942):


有没有办法解决这个问题?

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

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

在PHP文件中。

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

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;
}
这意味着-for的外部
循环的每次迭代都需要大约1.5MB的内存——在脚本耗尽内存之前,我只能进行131次迭代;而不是像您所希望的765次

考虑到您将
内存限制设置为
128M
,您必须将其设置为更高的值,例如

即使有

ini_set('memory_limit', '750M');
这还不够……用
800MB
,似乎足够了;-)


但我绝对不建议将
内存限制设置为这么高的值

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


我在这里看到的唯一解决方案是让您重新思考您的设计:除了使用这部分代码之外,您还可以做其他事情:-)


(顺便说一句:“重新思考您的设计”可能意味着使用另一种语言PHP:PHP在开发网站时非常棒,但并不适合所有类型的问题)

默认的PHP数组实现非常占用内存。如果您只是存储整数(以及许多整数),您可能需要查看。它使用常规的连续内存块来存储数据,这与传统的哈希结构不同

因为您正在内存中创建一个零填充数组,所以我假设您希望对此运行一些操作。在这种情况下,为什么不使用像Redis这样的数据存储呢?它将以较小的php开销保存大量数据。您可以在运行操作时忽略性能缺陷。
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;
}
int 1631968
int 2641888
int 3651808
...
...
int 132924168
int 133934088
Fatal error: Allowed memory size of 134217728 bytes exhausted
128*(765/131) = 747 MB
ini_set('memory_limit', '750M');