ImageMagick convert et faible RAM

12

Veuillez considérer la commande suivante pour le package imagemagick:

sudo convert -resize 460x200 /path/to/test1.jpg /path/to/test2.jpg

Maintenant, test1.jpgc'est une image assez grande (12,5 Mo), mais pas des tailles inconnues, mais le serveur sur lequel je travaille n'a que 1 Go de mémoire ( Amazon EC2 t2.micro si cela aide)

Aucune erreur n'est lancée, et pourtant aucune test2.jpgn'est créée. J'ai testé cela avec des images plus petites et cela fonctionne très bien. J'aurais pensé 1G si la mémoire était suffisante pour gérer un redimensionnement, mais peut-être pas?

Quelles sont mes options, dois-je avoir plus de mémoire ou manque-t-il quelque chose?

Toute suggestion est la bienvenue!

Modifications demandées

la sortie de strace montre: +++ killed by SIGKILL +++avec beaucoup de commandes qui semblent normales (ouverture /usr/share/localet lecture de longues chaînes, qui je suppose sont des données d'image)

gratuit me donne:

         total       used       free     shared    buffers     cached
Mem:       1016292     278348     737944       6412        460      13356
-/+ buffers/cache:     264532     751760
Swap:            0          0          0

Il semble donc que l'échange ne soit pas activé, je vais donc chercher à créer un fichier d'échange pour voir si cela trie mes problèmes.

Le fichier me donne:

testprint10Mbv2.jpg: JPEG image data, EXIF standard

Je collerais également le / path / to / img complet mais malheureusement il contient des données sensibles (adresses e-mail des clients, etc.)

Aphire
la source
1
Pourquoi utilisez-vous sudocette commande?
Charles Green
1
Reçu le message "Killed" quand je ne l'ai pas fait
Aphire
3
Ypu peut essayer de limiter la mémoire utilisée pour le cache de pixels avec l'argument -limit memory 64MiB(32 Mo est probablement un peu trop petit. La valeur par défaut est 1,5 Go). Et cela devrait vous donner une sortie descriptive en cas d'échec.
dadexix86
2
Essayez d'exécuter la commande avec en straceannexe devant la commande, voyez quels appels système sont effectués, erreurs levées. Faites-nous savoir
Sergiy Kolodyazhnyy
2
Terminé. Je suis content que vous ayez résolu le problème! la sortie gratuite confirme que l'échange est désactivé et les informations sur le fichier confirment qu'il ne s'agit pas d'un fichier mal identifié. Joli montage! +1
Elder Geek

Réponses:

7

Je suppose que vous manquez de RAM. Vous pouvez vérifier cela avec watch cat /proc/meminfopendant que votre processus est en cours d'exécution.

Vous n'avez peut-être pas suffisamment de RAM et / ou de SWAP pour accomplir votre tâche.

En raison de la condition de faible ram, assurez-vous que le swap est swapon -aactivé et si aucun swap n'est configuré sur le système, créez une partition pour le swap sur l'espace disque inutilisé et activez-le. Cela résoudra probablement le problème. Il y a une bonne réponse de @Takkat sur la façon de le faire ici Si vous n'avez pas accès au partitionnement du serveur, vous pouvez également utiliser un fichier d'échange pour l'échange

Elder Geek
la source
1
OP concerne un serveur cloud, la création d'une partition de swap peut ne pas être une option. Vous pouvez également ajouter Comment ajouter un nouveau fichier d'échange .
user.dz
@Sneetsher C'est exactement ce que j'ai fait, bon commentaire
Aphire
@Sneetsher "OP concerne un serveur cloud" n'était pas clair (du moins pour moi) à partir des données de la question, mais vous faites valoir un bon argument. modification de la réponse.
Elder Geek
@ElderGeek, en fait, il n'est pas bien mis en évidence Amazon EC2 t2.micro, j'ai édité la question pour la clarifier, j'ai ajouté une balise pour être facilement liée à d'autres questions connexes.
user.dz
@Sneetsher Je vois ça maintenant. Merci pour vos efforts!
Elder Geek
5

Le problème dans la question a été résolu en ajoutant le swap approprié. Pour être complet, permettez-moi de résumer les options supplémentaires que nous avons lors de l'exécution d'Image Magick convertsur des fichiers volumineux sur des systèmes à faible mémoire, ou lorsqu'il n'y a pas d'échange disponible, ou que l'échange était trop petit.

Les méthodes mentionnées ci-dessous sont développées en détail dans le manuel Image Magick:

Gestion d'image vraiment massive


Sommaire:

  1. Limitez l'utilisation de la mémoire avec l'option -limit

    Ce faisant, Image Magick créera un fichier temporaire pour la gestion des images dès que les limites de mémoire données auront été dépassées. Cela nécessite une autorisation d'écriture pour Image Magick dans le répertoire de fichiers temporaires. Nous pouvons donner n'importe quel chemin où le fichier temporaire sera créé dans une variable d'environnement MAGICK_TMPDIR. Un exemple de commande peut ressembler à ceci:

        env MAGICK_TMPDIR=/tempdir nice -5 convert -limit memory 32 -limit map 32 largefile.jpg -resize 640x320 smallfile.png
    

    Travailler sur disque plutôt qu'en RAM ralentira considérablement la vitesse de traitement.

  2. Travailler avec "Fichiers de disque mappés en mémoire"

    La création de fichiers MPC demande des ressources mais ne nécessite pas autant de ressources pour convertir à partir de fichiers MPC. Par conséquent, cela peut être pris en considération au cas où nous aurions besoin de convertir plusieurs fois la même source avec différents paramètres. Le flux de travail peut alors être similaire à ceci:

    convert huge.jpg huge.mpc
    convert huge.mpc -resize 50% big.png
    convert huge.mpc -resize 20% small.png
    convert huge.mpc -resize 5% thumb.png
    
  3. Travailler sur de petites sections d'une image en utilisant stream

    L'utilisation de revendications de flux pour traiter uniquement une partie de l'image source sans avoir besoin de charger toute l'image en mémoire.

    stream -map rgb -storage-type char -extract 600x400+1900+2900 image.png - | convert -depth 8 -size 600x400 rgb:- tile.png
    

    Dans l'exemple ci-dessus, l' -extractoption prend les valeurs de taille et de décalage définies par la géométrie Image Magick . Nous devrons coller les tuiles ensemble pour obtenir l'image à l'échelle dans son ensemble. Malheureusement, le flux ne fonctionne pas pour tous les formats d'image mais est censé fonctionner correctement sur les images JPEG.

Takkat
la source