Проблемы с PHP при попытке создать большой массив

Вот мой код, который создает 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)

Какие-либо идеи, как решить это?

14
задан spacemonkey 22 February 2010 в 20:23
поделиться

2 ответа

В качестве быстрого вычисления вы пытаетесь создать массив, содержащий:

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 отлично подходит для разработки веб-сайтов, но не подходит для всех типов задач)

29
ответ дан 1 December 2019 в 07:39
поделиться

Вам следует попробовать увеличить объем памяти, доступной PHP:

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

в вашем PHP файле.

1
ответ дан 1 December 2019 в 07:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: