Допустимый объем памяти исчерпан при синхронизации изображений с использованием imagecreatefromjpeg - PullRequest
0 голосов
/ 01 декабря 2011

Я пытаюсь синхронизировать изображения из одного каталога в другой, используя imagecreatefromjpeg, чтобы изменить размеры изображений в процессе. Всего скрипт должен обработать 15 ГБ файлов изображений. Сначала скрипт работал нормально, пока я не столкнулся с ограничением памяти. Я обнаружил, что это было исправлено, установив следующий код:

ini_set("memory_limit","64M");

Но после гораздо большего количества изображений, где синхронизировалась, снова и снова возникала та же проблема, и снова, и до пятого раза, когда я устанавливал ограничение на 1000M, но это больше не решало проблему. Даже после попытки 9999M он все равно выдал мне ту же ошибку:

Fatal error: Allowed memory size of 1778384896 bytes exhausted (tried to allocate 57060 bytes)

Я проверил свой phpinfo () и обнаружил, что он был правильно установлен:

Directive     Local Value Master Value  
memory_limit  99999M      512M

Может кто-нибудь дать мне еще один вариант увеличения лимита памяти?

Добавление кода, который я использую для синхронизации:

// SYNCHRONIZE FILES
// GET SOURCE FILES
if ($handle = opendir($hrdir)) {                
    while (false !== ($file = readdir($handle))) {
        if(is_file($hrdir.$file)) {                             
            $nieuwehr_array[$file] = filemtime($hrdir.$file);
        }
    }

    closedir($handle);
}   

// GET EXISTING FILES
if ($handle = opendir($hrdestinationdir)) {             
    while (false !== ($file = readdir($handle))) {
        if(is_file($hrdestinationdir.$file)) {              
            $huidigehr_array[$file] = filemtime($hrdestinationdir.$file);
        }
    }

    closedir($handle);
}           

$hr_added_array = array();
$hr_modified_array = array();

// ADD NEW OR MODIFIED FILES
foreach($nieuwehr_array as $file => $change_date) {
    if(!isset($huidigehr_array[$file]) || $change_date != $huidigehr_array[$file]) {
        new createImage($hrdir, $file, $hrdestinationdir, 800, 600);
        touch($hrdestinationdir.$file,$change_date);
        if(isset($huidigehr_array[$file])) {                
            $hr_modified_array[] = $file;
        } else {                
            $hr_added_array[] = $file;
        }
    }
}

Заранее извиняюсь за некоторые имена голландских переменных.

Изменить 1-12-2011 12:00: Просто обнаружил, что проблема была в файле образа размером 62 МБ. Похоже, файл больше, чем дать или взять 55 МБ являются проблемой. Кто-нибудь знает, что может вызвать это?

1 Ответ

0 голосов
/ 01 декабря 2011

Кто-нибудь может дать мне еще один вариант увеличения лимита памяти?

Почему бы вам не спросить, как написать программу с более нормальным потреблением памяти?

Вы читаете все свои изображения в массиве, а не одно за другим?

И что, на земле, вы называете «синхронизировать»?

new createImage($hrdir, $file, $hrdestinationdir, 800, 600);

кажется, что эта строка - ваша проблема.

Что касается размера изображения,

  1. Никакой размер файла не влияет на память, но размеры изображения.
  2. Никакое изображение, даже если сжатый размер 64 МБ, не может потреблять 10 ГБ ОЗУ.Это действительно утечка памяти в вашем коде, а не в конкретном изображении.

Добавьте несколько вызовов к memory_get_usage в вашем коде и посмотрите прогресс.

echo "MEM: ",number_format( memory_get_usage()/(1024*1024) ),"MB used\n";
...