Вот мой код, который создает 2-й массив, заполненный нулями, измерения массива (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)
Какие-либо идеи, как решить это?
В качестве быстрого вычисления вы пытаетесь создать массив, содержащий:
795*6942 = 5,518,890
целых числа.
Если учесть, что одно целое число хранится в 4 байтах (т.е. 32 бита; при использовании PHP, не меньше) , это означает:
5518890*4 = 22,075,560
байтов.
Хорошо, быстрое вычисление ... результат: «, должно быть хорошо ».
Но все не так просто, к сожалению: - (
Я полагаю, это связано с тем фактом, что данные хранятся PHP с использованием внутренней структуры данных, которая намного сложнее, чем простые 32-битные integer
Теперь, чтобы быть любопытным, давайте изменим вашу функцию так, чтобы она выводила, сколько памяти используется в конце каждого из внешних для
-цикла:
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;
}
Здесь я ' m получает такой результат (PHP 5.3.2-dev в 64-битной системе; memory_limit
установлен на 128MB
- что уже много!) :
int 1631968
int 2641888
int 3651808
...
...
int 132924168
int 133934088
Fatal error: Allowed memory size of 134217728 bytes exhausted
Это означает, что каждая итерация внешнего для
-цикла требует примерно 1,5 МБ памяти - и я получаю только 131 итерацию, прежде чем скрипту исчерпается память; а не 765, как вы хотели .
Учитывая, что вы установили для своего memory_limit
значение 128M
, вам придется установить его намного выше - например,
128*(765/131) = 747 MB
Ну, даже с
ini_set('memory_limit', '750M');
это все равно недостаточно ... с 800MB
кажется достаточно; -)
Но я бы определенно не рекомендовал устанавливать memory_limit
на такое высокое значение!
(Если у вас 2 ГБ ОЗУ, ваш сервер не сможет обрабатывать более 2 одновременных пользователей ^^ ;; Я бы не стал тестировать это, если бы мой компьютер имел 2 ГБ ОЗУ, если честно)
Единственное решение, которое я вижу здесь, - это переосмыслить свой дизайн: должно быть что-то еще, что вы можете сделать, кроме использования этой части кода: -)
(Кстати: возможно, «переосмыслить свой дизайн» означает использовать другой язык PHP: PHP отлично подходит для разработки веб-сайтов, но не подходит для всех типов задач)
Вам следует попробовать увеличить объем памяти, доступной PHP:
ini_set('memory_limit', '32M');
в вашем PHP файле.