Très cher ImageMagick (très lent)

Pour une galerie photo que j’essaye de développer sur Redmine, j’utilise la commande convert d’ImageMagick pour générer les miniatures. Vous trouverez la version d’ImageMagick et les deux commandes utilisées ci-dessous.

Le problème est le suivant : pour générer 2 x 25 images, il lui faut 1 minute et 20 secondes, c’est un truc de fou comment c’est lent. Alors en effet, il faut compter que les images sources font entre 3 et 5 Mo, plus le temps des requêtes et du traitement par le serveur. Mais je trouve que ce n’est pas une raison pour prendre autant de temps.

Version: ImageMagick 6.7.7-10 2013-09-01 Q16 http://www.imagemagick.org Copyright: Copyright (C) 1999-2012 ImageMagick Studio LLC Features: OpenMP

convert source.jpg -thumbnail 200x150 -gravity Center -extent 200x150 -quality 80 destination1.jpg convert source.jpg -thumbnail 1200x900 -gravity Center -extent 1200x900 -quality 85 destination2.jpg

Voici quelques images et fichiers :

  • 89-redmine.conf : la configuration du serveur lighttpd pour Redmine ;
  • apijs_controller.rb.txt : le contrôleur qui lance les commandes convert ;
  • htop.png : processus lors du traitement, on voit qu’un seul cœur travaille, et que très bizarrement, il y a plusieurs commandes convert pour la même image ;
  • top.png : processus lors du traitement, on voit qu’un seul cœur travaille ;
  • process.png : processus lors du traitement, par phpsysinfo.

J’ai trouvé un vieux bug des années 2011, #638409, mais je sais pas trop si c’est sa ou autre chose. Quelqu’un aurai une idée ?
89-redmine.conf.txt (4.56 KB)
apijs_controller.rb.txt (5.8 KB)

Salut,

imagemagick: Installé : (aucun) Candidat : 8:6.7.7.10-6 Table de version : 8:6.7.7.10-6 0 500 http://ftp.fr.debian.org/debian/ testing/main amd64 Packages 500 http://ftp.fr.debian.org/debian/ unstable/main amd64 Packages 8:6.7.7.10-5+deb7u2 0 500 http://ftp.fr.debian.org/debian/ stable/main amd64 Packages 500 http://security.debian.org/ stable/updates/main amd64 Packages

Dis leur de quelle version tu te sers. 6.7.7.10 n’est pas suffisant pour savoir :slightly_smiling:

Essaie de comparer avec ffmpeg
https://trac.ffmpeg.org/wiki/Scaling%20%28resizing%29%20with%20ffmpeg

@ggoodluck47 : je me vois mal déterré ce vieux sujet, car à ce que j’ai pu voir sur le net un peu partout, c’est bien openmp qui pose problème…

@piratebab : oui j’y travail… Mais avant, je me suis dis qu’il fallait essayer ruby-gd (0.8.0-3).
Sauf que là, c’est le drame, la méthode new_from_jpeg n’existe pas…

J’ai ouvert un rapport de bug, mais je suis sur qu’on va me dire, qu’il faut que je mette à jour pour Ruby 1.9, si jamais il y a une réponse.


Bref, j’ai fini par essayé ffmpeg, c’est effectivement beaucoup plus rapide. Cependant, je n’arrive pas à faire une miniature avec les bandes en haut et en bas.

J’ai ensuite demandé à Google son avis, et je suis tombé la-dessus : search.cpan.org/~tokuhirom/Image-Epeg-0.13/

J’aurais bien testé, mais je ne trouve pas de paquet deb :’(.

Bon, et bien, j’ai finis avec Python, qui est pour moi deux fois plus rapide que ffmpeg.
Je passe de 1 minute et 20 secondes avec ImageMagick à 11 secondes avec Python-Imaging.

[code]import os
import sys
import Image

IN = sys.argv[1]
OUT = sys.argv[2]
SIZE = (int(sys.argv[3]), int(sys.argv[4]))

if not os.path.exists(os.path.dirname(OUT)):
os.makedirs(os.path.dirname(OUT))

thumbImg = Image.open(IN)
thumbImg.thumbnail(SIZE, Image.ANTIALIAS)

offset_x = max((SIZE[0] - thumbImg.size[0]) / 2, 0)
offset_y = max((SIZE[1] - thumbImg.size[1]) / 2, 0)
offset_tuple = (offset_x, offset_y)

finalImg = Image.new(‘RGBA’, SIZE, (255,255,255,0))
finalImg.paste(thumbImg, offset_tuple)
finalImg.save(OUT, ‘JPEG’)[/code]

Ma remarque n’a rien a voir avec ton pb, mais pour htop tu peu l’organisé un peu mieux pour faire ressortir des info utiles :
“t” / F5 : fait apparaitre l’arbre de parenté
"S" : te permet de caché/ faire apparaitre les colonnes ou info utiles, par exemple mettre d’une autre couleur le “base name” des process, ou mettre d’une couleur différente les process et threads.
Par exemple :