0

imagecreatefromjpegを使用して、あるディレクトリから別のディレクトリに画像を同期し、その過程で画像のサイズを変更しようとしています。合計で、スクリプトは15GBの画像ファイルを処理する必要があります。最初は、メモリ制限にぶつかるまで、スクリプトは問題なく実行されていました。次のコードを設定することで、これが修正されたことがわかりました。

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

しかし、同期された多くの画像の後、同じ問題が何度も何度も発生し、5回目に制限を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-201112:00:問題が62MBの画像ファイルであることがわかりました。ファイルが大きいように見えますが、55MBを与えるか取るかが問題です。誰かがこれを引き起こす可能性があることを知っていますか?

4

1 に答える 1

0

誰かが私にメモリ制限を増やすための別のオプションを与えることができますか?

より健全なメモリ消費量のプログラムを作成する方法を聞いてみませんか?

すべての画像を1つずつではなく、配列で読んでいますか?

そして、いったい何を「同期」と呼んでいますか?

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

この線があなたの問題のようです。

画像サイズについては、

  1. ファイルサイズはメモリに影響しませんが、画像のサイズに影響します。
  2. 64Mの圧縮サイズであっても、10GのRAMを消費できるイメージはありません。これは確かに、特定の画像ではなく、コードのメモリリークです。

コード内にいくつかの呼び出しを追加してmemory_get_usage、進行状況を確認します。

echo "MEM: ",number_format( memory_get_usage()/(1024*1024) ),"MB used\n";
于 2011-12-01T08:55:44.253 に答える