web-dev-qa-db-fra.com

ImageMagick convert et faible RAM

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

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

Désormais, test1.jpg est une assez grande image (12,5 Mo), mais pas inédite en taille, mais le serveur à partir duquel je travaille ne dispose que de 1 G de mémoire ( Amazon EC2t2.micro si cela aide)

Aucune erreur n'est générée et pourtant, aucun test2.jpg n'est créé. J'ai testé cela avec des images plus petites et cela fonctionne bien. J'aurais pensé 1G si la mémoire serait assez pour gérer un redimensionnement, mais peut-être pas?

Quelles sont mes options, dois-je avoir plus de mémoire ou est-ce que je manque quelque chose?

Toute suggestion est la bienvenue!

Éditions demandées

la sortie de strace montre: +++ killed by SIGKILL +++ avec beaucoup de commandes qui semblent normales (ouverture de /usr/share/local et lecture de longues chaînes, ce qui, je suppose, est une donnée d'image)

free 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 le swap n'est pas activé. Je vais donc créer un fichier swap pour voir si cela résout mes problèmes.

Le fichier me donne:

testprint10Mbv2.jpg: JPEG image data, EXIF standard

Je voudrais aussi coller le chemin/chemin/vers/img complet, mais malheureusement, il contient des données sensibles (adresses électroniques des clients, etc.)

12
Aphire

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

RAM et/ou SWAP sont peut-être insuffisants pour accomplir votre tâche.

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

7
Elder Geek

La question dans la question a été résolue en ajoutant swap approprié. Par souci d'exhaustivité, laissez-moi vous résumer les options supplémentaires disponibles lors de l'exécution d'Image Magick convert sur 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étaillées dans le manuel Image Magick:

Traitement d'images réellement massif


Résumé:

  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 spécifiées ont été dépassées. Cela nécessite une autorisation en écriture pour Image Magick sur 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 le disque plutôt que dans 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 nécessite beaucoup de ressources, mais la conversion à partir de fichiers MPC ne nécessite pas autant de ressources. Par conséquent, cela peut être pris en compte au cas où nous aurions besoin de convertir plusieurs fois la même source avec des paramètres différents. Le flux de travail peut alors ressembler à 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. Travaillez sur de petites sections d'une image en utilisant stream

    L'utilisation de stream prétend ne traiter qu'une partie de l'image source sans qu'il soit nécessaire 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'option -extract prend des valeurs de taille et de décalage telles que définies par la géométrie Image Magick . Nous devrons recoller les carreaux pour obtenir l'image redimensionnée dans son ensemble. Malheureusement , le flux ne fonctionne pas pour tous les formats d'image, mais est supposé fonctionner correctement avec les images JPEG.

5
Takkat