Xpoint
   [напомнить пароль]

И опять модуль Image::Magick и память

Метки: [без меток]
[удл]
2005-12-04 13:47:05 [обр] 613[досье]

Прошу помощи! Написал скрипт для автоматической обработки изображений: заливаю фотки в папку по ftp, запускаюскрипт и он должен обработать(уменьшить и создать к каждой фотке превьюшки) и скопировать в другую папку, после чего удаляем исходный каталог и создаем его снова.
Скрипт обрабатывал первые 19 картинок и всё, после того как я связался с провайдером, мне сказали вот что:

Здравствуйте.
проблема в том, что скрипт потребляет слишком много ресурсов процессора.
Даже после того, как я поднял планку с 10 до 20%, все равно скрипт не обрабатывает все картинки.
Видимо, он написан некорректно, так как при последовательной обработке картинок совершенно непонятно, почему он при работе требует всё больше и больше ресурсов процессора
==========
Знаю, что ковырятся в чужом коде это бред, но если кто может объяснить где моя ошибка и почему скрипт столько сжирает памяти всё больше и больше? Заранее благодарю за любую помощь.

#!/usr/bin/perl
use DBI;
use CGI;
use File::Path;
use Image::Magick;
use CGI::Carp qw (fatalsToBrowser);
use strict;
my @NAMES = ();
my @images = ();
my $GAL_DIR = "../../gal/";
my $TMP_GAL_DIR = "../../../gal/";
my $gal_id = 50;
$|++;

do 'conf';

#our $dbuser = $dbuser;
#our $dbpass = $dbpass;
#our $host = $host;
#our $dbname = $dbname;

#my $q = new CGI;
print "Content-type: text/html\n\n";

#my $dbh = DBI->connect("DBI:mysql:$dbname:$host",$dbuser,$dbpass) || die $DBI::errstr;

 
opendir SRC,"$TMP_GAL_DIR" or die "Directory does not exist at $TMP_GAL_DIR !";
      @NAMES = readdir SRC;
         closedir SRC or die "DIR Handle does not close successfull at $TMP_GAL_DIR !";
         @images = grep (/\.jpe?g$/i,@NAMES);
         my $i = scalar(@images);
         
die "No *.jpg images found in $TMP_GAL_DIR" if @images < 1 ;

         #my $sth = $dbh->prepare ("insert into t_gal (f_name,f_date,f_descr) values ('$name','$date','$descr')") or die $dbh->errstr;
         #$sth->execute() or die $dbh->errstr;
         #$gal_id = $dbh-> {'mysql_insertid'} or die $dbh->errstr;

         &create_new_gal($gal_id,\@images);

       # my $x = &delete_dir_content($TMP_GAL_DIR);
       # mkdir("$TMP_GAL_DIR");
       # chmod 0777,$TMP_GAL_DIR;
       # print "Deleted items = $x";

        # $dbh->disconnect();
    

sub create_new_gal{

    my $gal_id = shift;
    my $images = shift;
    mkdir("$GAL_DIR$gal_id");# or die "Can't create directory at $GAL_DIR$gal_id !";
    chmod 0777,"$GAL_DIR$gal_id";
    my $i = 1;
    print "test count = ".scalar(@$images)."<br>";
  for my $image (@$images){
        
$i = sprintf("%08d",$i);
    my $new_name = &new_name($image,$i);
       &copy_magick("$TMP_GAL_DIR$image","$GAL_DIR","$gal_id","$new_name") ;
       $i++;
       
}

}

sub copy_magick{

    my $src = shift;
    my $gal_dir = shift;
    my $gal_name = shift;
    my $img_name = shift;
    my ($w,$h);
    print "test src = $src <br>";

    my $img = Image::Magick->new;

    my $stat = $img->Read($src);
    die "$stat Can't read img $src !" if "$stat";
    ($w,$h) = $img->Get('width','height');
    my $my_w = $w ;
    my $my_h = $h ;
    my $my_t_w;
    my $my_t_h;
    if ( $my_w > 600 || $my_h > 600 )
    {
      if ( $w > $h )
      {
         $my_w = 600 ;
         $my_h = $h * $my_w/$w;
      }
      else
      {
         $my_h = 600 ;
         $my_w = $w * $my_h/$h;
      }
    }
  
if ( $w > $h )
   {
      $my_t_w = 120 ;
      $my_t_h = $h * $my_t_w/$w;
    }
    else
    {
       $my_t_h = 120 ;
       $my_t_w = $w * $my_t_h/$h;
    }
   # print "test w=$w,h=$h <br>";

   $stat = $img->Resize(width=>"$my_w",height=>"$my_h");

   die "$stat Can't resize img $src !" if "$stat";

   $stat = $img->Write(filename=>"$gal_dir$gal_name/$img_name",compression=>'JPEG',quality=>'50');
   
die "$stat Can't write img $src !" if "$stat";

   $stat = $img->Thumbnail(width=>"$my_t_w",height=>"$my_t_h");

   die "$stat Can't resize thumbneil $src !" if "$stat";

   $img_name="t"."$img_name";
    
$stat = $img->Write(filename=>"$gal_dir$gal_name/$img_name");

   die "$stat Can't write thumbneil $src !" if "$stat";

   undef $img;
}

sub new_name{
    my $name = shift;
    my $i = shift;
    $name =~ s/^.*\.([^.]*)$/$1/;
    $name = $i.".".$name;
    return $name;
}

sub delete_dir_content{
    my $dir = shift;
    my $x = rmtree("$dir");
    return $x;

}

спустя 20 часов [обр] Cyrill(3/7)[досье]

В этой части кода, на мой взгляд, никакого криминала нет.

PS: Для подобных целей можно использовать <a href="http://www.stanford.edu/~epop/igal/">igal</a>. Ну, уж подглядеть как он устроен - точно стоит.

спустя 5 минут [обр] Закиров Руслан(51/343)[досье]
613[досье] 1) Так с процессорным временем или с памятью проблема?
  1. На форуме есть форматирование (http://xpoint.ru/help/formatting.xhtml.)
спустя 45 минут [обр] Алексей Севрюков(61/1292)[досье]
Ну а чего Вы хотите, это ведь не 2+2, это все таки обработка картинок. Довольно ресурсоемкая операция.
спустя 1 час 12 минут [обр] 613[досье]

Закиров Руслан[досье] Про форматирование не знал, учту.
По поводу память это или проц, фиг его знает, я привёл полностью ответ провайдера, а что есть варианты?
Алексей Севрюков[досье] Я понимаю, но как то это пишут или нет? Кто нибудь писал такие скрипты?
Cyrill[досье] Вряд ли хостер будет устанавливать у себя сторонние библиотеки, здесь тоже используется Image::Magick.

Честно говоря я писал этот скрипт у другог хостера сначала на Magick(но версия была кривая, а хостер не захотел её обновлять) а потом переписал на GD и всё работало(даже с картинками размером по 1мб и больше), но это было у другого хостера. У этого GD не установлен, попрошу поставить и запущу аналог с библиотекой GD, посмотрим что получится.
Просто так в лом по одной картинке заливать, когда картинок больше сотни =)

Powered by POEM™ Engine Copyright © 2002-2005