【问题标题】:Allowed memory size exhausted while synchronizing images with use of imagecreatefromjpeg使用 imagecreatefromjpeg 同步图像时允许的内存大小耗尽
【发布时间】:2012-01-10 10:24:39
【问题描述】:

我正在尝试使用 imagecreatefromjpeg 将图像从一个目录同步到另一个目录以在此过程中调整图像大小。该脚本总共必须处理 15 GB 的图像文件。起初脚本运行得很好,直到我遇到内存限制。我发现通过设置以下代码可以解决此问题:

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;
        }
    }
}

我提前为一些荷兰变量名道歉。

编辑 2011 年 1 月 12 日 12:00: 刚刚发现问题是62MB的图像文件。看起来文件更大然后给或取 55MB 是问题所在。有人知道是什么原因造成的吗?

【问题讨论】:

  • 听起来你有内存泄漏。您应该一次同步一个图像,确保在继续处理另一个图像之前“取出垃圾”。 http://stackoverflow.com/questions/1735492/is-there-garbage-collection-in-php
  • 我上传了用于同步图像的代码。如您所见,我使用“createImage”(这是一个在其构造函数中调整图像大小和重新定位图像的类)将丢失的图像复制到目标目录。这个类中使用的内存应该在完成后被垃圾吧?

标签: php image memory-limit


【解决方案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";

【讨论】:

  • 同步的意思是:我有一个包含图像的目录,我有一个空目录。通过同步,我希望将一个目录中的所有图像都放到另一个目录中,但宽度和高度不同。至于存储文件。我创建了一个数组,其中包含每个文件的文件名和创建日期,并且两个目录都有两个单独的数组,以便我可以比较它们以查看文件是否已经存在。
  • 在循环遍历一个数组并与另一个数组进行比较时,每次我找到一个不存在的文件时,我都会调用一个函数“createImage”(所以当函数返回时,这个函数中所做的一切都应该被丢弃) .
  • 似乎并非一切。为什么不能直接复制图片?
  • 因为用户上传的图片非常大,所以我必须在复制之前/期间调整它们的大小。
  • 您不是在“调用函数”,而是在创建一个对象。每次您要处理图像时。如果只创建一个对象一次,但调用它的函数来创建图像?
猜你喜欢
  • 2020-06-25
  • 2014-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-30
  • 1970-01-01
相关资源
最近更新 更多