Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 11/02/2016, à 00:58

choco

[auto résolu] Conversion avec imagemagick trop gourmand en mémoire

Bonsoir,

J'ai petit souci avec cette ligne de commande :

convert ../*.jpg -resize 192x120\! -set filename:f '%t.jpg' +adjoin '%[filename:f]'

Cette commande fonctionne très bien avec un petit nombre de photo, mais dès je dépasse les 2000 photos à convertir simultanément, imagemagick essaye de stocker l'intégrale des images décompresser dans la mémoire vive (8Go), puis dans le swap (4Go)  et enfin le fichier temporaire remplissant du même coup la partition racine (15Go de libre). Donc je suis obligé de stopper l'action de la commande avec CTRL+C avant la fin de la conversion.

Est-il possible par le biais d'un script de faire sélectionner à imagemagick image par image afin de libérer le cache au fur et à mesure ?

Cette ligne de commande devrait me servir dans un script d'automatisation pour créer des miniatures.

[edit]
Bon j'ai réfléchi un peu, je ne pense pas que ce soit très élégant comme code mais ça fonctionne.

#!/bin/bash -x
cd ./db

txt='../liste.txt'

> $txt

find "${PWD}" -type f | sed -e "s/\/.*\///" | sort -g > $txt

mkdir ./thb

while read line
do
  file=${line#./}
  name=${file%.jpg}
  convert -resize 192x120 "$line" ./thb/$name.jpg
done < $txt

rm $txt

read -p "Pressez entrer pour fermer" 

Si vous avez des idées pour améliorer le code je suis preneur.
[/edit]

Dernière modification par choco (Le 11/02/2016, à 01:18)


geek 1.0 cherche geekette 1.0 pour une merge en dualgeek2.0, optimisation du code source envisageable pour une meilleure cohabitation.

Hors ligne

#2 Le 11/02/2016, à 02:19

MicP

Re : [auto résolu] Conversion avec imagemagick trop gourmand en mémoire

Je ne sais pas quel est l'intérêt de ce tri numérique, alors je l'ai zappé.

Je n'ai pas compris pourquoi tu utilise des chemins relatifs, mais j'ai laissé tel-quel,
par contre, je n'ai pas trouvé indispensable de changer de répertoire.

la commande qui suit le && (while …) ne sera exécuté que si la commande qui précède le && (mkdir …) a pu terminer son exécution sans erreur.

#!/bin/bash

repSrc="./db"
repCible="${repSrc}/thb"

mkdir "${repCible}" && while read line; do
    convert -resize 192x120 "${repSrc}/${line}" "${repCible}/${line}")
done <<< $(ls -F "${repSrc}")

Dernière modification par MicP (Le 11/02/2016, à 03:14)

Hors ligne

#3 Le 11/02/2016, à 02:54

Watael

Re : [auto résolu] Conversion avec imagemagick trop gourmand en mémoire

c'est pas bien d'exécuter des scripts avec des chemins relatifs.

<<< $(cmd)

=

< <(cmd)

moi, j'aurais fait une boucle for, ou j'aurais tout fait dans find avec un -exec sh -c 'convert ...' _ {} \;, bien sûr, assorti d'une substitution de paramètre.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#4 Le 11/02/2016, à 03:23

MicP

Re : [auto résolu] Conversion avec imagemagick trop gourmand en mémoire

Je préfère aussi le for :

#!/bin/bash

repSrc="./db"
repCible="${repSrc}/thb"

mkdir "${repCible}" && for fich in $(ls -F "${repSrc}"); do
    convert -resize 192x120 "${repSrc}/${fich}" "${repCible}/${fich}")
done

Hors ligne

#5 Le 11/02/2016, à 04:13

Watael

Re : [auto résolu] Conversion avec imagemagick trop gourmand en mémoire

« Gare aux bobos ! » en parcourant une substitution de commande avec for !

ce sera plus robuste en utilisant le développement de chemins :

for f in "$repSrc"/*
do
   test -f "$f" && {
      nomFichier="${f##*/}"
      convert -resize 192x120 "$repSrc/$nomFichier" "$repDst/$nomFichier"
   }
done

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#6 Le 11/02/2016, à 12:05

choco

Re : [auto résolu] Conversion avec imagemagick trop gourmand en mémoire

Merci pour ces réponses très instructives wink

Je vais retenir le code Watael avec la boucle for au lieu de read line, même si les autres sont intéressant d'un point de vu technique. J'avais toujours pensé que read line ne s'utilisait qu'avec un fichier texte.

J'ai appris en autodidacte, donc j'ai pas mal de mauvaise pratique. Mes profs ont été des cookbooks avec des choses glanées sur le net.

Du coup ça m'intéresse de savoir pourquoi les chemins relatifs ne sont pas conseillés dans les scripts.


geek 1.0 cherche geekette 1.0 pour une merge en dualgeek2.0, optimisation du code source envisageable pour une meilleure cohabitation.

Hors ligne

#7 Le 11/02/2016, à 18:06

Watael

Re : [auto résolu] Conversion avec imagemagick trop gourmand en mémoire

simplement parce que le script peut être exécuté depuis des répertoires différents, ou le script peut être déplacé.
mais les chemins relatifs se référenceront toujours au répertoire en cours ($PWD) sad

de même, il est préférable de mettre le chemin complet, ainsi que les informations longues et/ou qui se répètent, dans autant de variables, afin de n'avoir, éventuellement, à les modifier qu'une seule fois dans le script. Ça évite bien des erreurs wink

Dernière modification par Watael (Le 11/02/2016, à 18:07)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#8 Le 11/02/2016, à 23:03

choco

Re : [auto résolu] Conversion avec imagemagick trop gourmand en mémoire

Ok je suis bien d'accord, dans mon cas je ne peux pas toujours mettre de chemin absolu dans le sens où mes scripts servent à plusieurs serveurs avec des chemins différents. (Serveur test, serveur de prod et serveur en cours de validation) la structure de l'arborescence est assez différentes entre ces trois là. Mais je comprends bien ce que tu veux dire.


geek 1.0 cherche geekette 1.0 pour une merge en dualgeek2.0, optimisation du code source envisageable pour une meilleure cohabitation.

Hors ligne