spa*_*key 14 php memory arrays
这是我的代码,它创建了填充零的2d数组,数组维度为(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);
Run Code Online (Sandbox Code Playgroud)
这是我收到的错误:
Allowed memory size of 134217728 bytes exhausted (tried to allocate 35 bytes)
Run Code Online (Sandbox Code Playgroud)
任何想法如何解决这个问题?
Pas*_*TIN 29
作为一个快速计算,您正在尝试创建一个包含以下内容的数组:
795*6942 = 5,518,890
Run Code Online (Sandbox Code Playgroud)
整数.
如果我们认为一个整数存储在4个字节(即32位;使用PHP,它不会少),它意味着:
5518890*4 = 22,075,560
Run Code Online (Sandbox Code Playgroud)
字节.
好的,快速计算...结果是" 它应该没问题 ".
但事情并非那么容易,不幸的是:-(
我认为这与数据是由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;
}
Run Code Online (Sandbox Code Playgroud)
有了这个,我得到了这种输出(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
Run Code Online (Sandbox Code Playgroud)
这意味着外部循环的每次迭代都for需要1.5 MB的内存 - 而且在脚本耗尽内存之前我只能进行131次迭代; 而不是像你想要的那样765.
考虑到你设定memory_limit到128M,你必须将其设置为一些真正高得多-像
128*(765/131) = 747 MB
Run Code Online (Sandbox Code Playgroud)
好吧,即使有
ini_set('memory_limit', '750M');
Run Code Online (Sandbox Code Playgroud)
它仍然不够......有800MB,似乎够了;-)
但我绝对不建议设置memory_limit这么高的价值!
(如果你有2GB的RAM,你的服务器将无法处理超过2个并发用户^^ ;;如果我的计算机有2GB的RAM,我实际上不会测试这个,说实话)
我在这里看到的唯一解决方案就是让你重新思考你的设计:除了使用这部分代码之外,还有别的东西可以做:-)
(顺便说一句:也许"重新思考你的设计"意味着使用另一种语言PHP:PHP在开发网站方面很棒,但不适合各种问题)
| 归档时间: |
|
| 查看次数: |
21350 次 |
| 最近记录: |