#1 Le 10/02/2016, à 23: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, à 00: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, à 01: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, à 02:14)
Hors ligne
#3 Le 11/02/2016, à 01: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, à 02: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, à 03: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, à 11:05
- choco
Re : [auto résolu] Conversion avec imagemagick trop gourmand en mémoire
Merci pour ces réponses très instructives
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, à 17: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)
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
Dernière modification par Watael (Le 11/02/2016, à 17:07)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#8 Le 11/02/2016, à 22: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