Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
purge_non_existing_images
#1
Bonjour,

Après quelques années d'utilisation je me suis inévitablement retrouvé avec un certain nombres d'images orphelines de leur fichier (tête de mort)

J'ai d'abord utilisé la dernière version du script dt  purge_non_existing_images.sh pour faire le nettoyage
https://github.com/darktable-org/darktab..._images.sh

Très lent. J'ai cru qu'il s'était planté. En lisant le script, je me suis dit qu'il pouvait être amélioré en utilisant (g)awk

Benchmark
  • DB de 17000 fichiers/images (table images)
  • fichiers orphelins à purger: 80
  • script dt: 50 sec.
  • script awk: 5 sec.
  • script gawk: 0.3 sec.
Le problème du script dt est qu'il utilise un "read" shell séquentiel sur le fichier des images de la DB et surtout que chaque DELETE est exécuté en invoquant à chaque fois un process sqlite3 au lieu d'utiliser une seule transaction sqlite (begin...commit).

Mon script awk utilise un appel au shell ("system") pour vérifier l'existence d'un fichier alors que le script gawk utilise "stat()" de la librairie filefunc de gawk. Bien plus rapide que l'appel "system".

Version awk
https://gist.github.com/esperlu/cdad8e7e...ea4d06d4bb

Version gawk
https://gist.github.com/esperlu/3d4c58bd...ac4144bd51

Quelqu'un pour valider ces scripts? J'ai testé, mais qu'en pensent les dev?

Note: utiliser, bien sûr, une copie de library.db pour tester.

Jean-Luc
Répondre
#2
Bonjour
Merci pour ces scripts, je les garde dans un coin pour tester ça quand j'aurai trop d'images orphelines :-)
Répondre
#3
Je viens de les télécharger, Je vais voir combien j'ai d'images orphelines dans ma base de données et faire un essai mais j'ai mais je ne crois pas que leur nombre soit significatif pour tes scripts.
Répondre
#4
N'ayant aucune image dans ce cas je ne peux pas tester.
--
Pascal - GNU/Debian (sid) - version darktable git/master
http://photos.obry.net
Répondre
#5
Pour ceux qui aimeraient tester, il suffit de copier un répertoire de photos existantes vers un répertoire test, ouvrir ce répertoire test dans dt et ensuite de le supprimer (dans l'OS, pas dans dt évidemment). Plus le nombres d'orphelins est important, plus grand est le gain de temps. Ce n'est pas tellement le nombre de photos de la db qui joue quoique utiliser un "read" du shell sur le résulat du select de la table "images" puis trois pipes vers "cut" pour parser les données n'est pas ce qui est de plus efficace. (g)awk est vraiment fait pour ça.

Le gain de temps principal se trouve dans l'utilisation des transactions sqlite pour les delete. Si on aime pas awk, on peut facilement modifier le script officiel pour utiliser les tansactions sqlite. Je veux bien m'en charger.
Répondre
#6
> et ensuite de le supprimer (dans l'OS, pas dans dt évidemment)

Ce que ne devrait jamais être fait, et du coup c'est pour cela que je n'ai aucune photo orpheline.
--
Pascal - GNU/Debian (sid) - version darktable git/master
http://photos.obry.net
Répondre
#7
Il m'arrive parfois de perdre le lien entre dt et le RAW sans que je ne déplace, ni n'efface  ...
Du coup j' ai quelques "têtes de mort" que je supprime ("enlever") et réimporte ... Mais il doit bien en rester ! Tongue
Répondre
#8
(13-11-18, 13:20)pascal a écrit : > et ensuite de le supprimer (dans l'OS, pas dans dt évidemment)

Ce que ne devrait jamais être fait, et du coup c'est pour cela que je n'ai aucune photo orpheline.


Je ne suis pas aussi discipliné et j'ai parfois tendance à prendre les raccourcis de l'OS pour faire le ménage. Mauvaise idée, on est d'accord, mais ça m'arrive encore accidentellement. C'est sans doute pour des erreurs de ce type que dt propose d'utiliser un script pour nettoyer la db.

J'ai modifié ce script en gardant le read | cut | etc... mais en utilisant les transactions de sqlite. Le gain est moindre évidemment que pour les scripts utilisant awk, mais on gagne à peu près 30 sec. sur les 50 sec. du script "vanilla".
https://gist.github.com/esperlu/4b5db443...a214ada781

En résumé:
Benchmark
En passant, merci à tous les dev's présents et passés de nous avoir donné ce formidable outil qui m'a redonné goût à la photo. Du beau boulot assurément!
Répondre
#9
Je réactive ce sujet car il me parait aborder un point important d'UX de DT
Je crois que la fonction purger les images "tête de mort" devrait être un bouton dans DT et non un script purge_non_existing_images.sh
Lorsque que l'on est photographe pro comme moi on fait face à des montagnes d'images. La gestion des archives : dupliquer, changer les images de disques parcequ'ils sont vieux et peu rapide, reorganiser, renommer, supprimer le non-choix d'un reportage pas important après quelques mois, une fois que l'on est sûr que le client n'y reviendra pas, etc, etc... Toutes ces manip ne se font pas dans DT, qui comme les developpeurs le disent bien, n'est pas un systeme de fichier. Donc on utilise le systeme de fichier pour les transferts ou encore, pour ma part XnView pour elaguer, reorganiser les dossier, etc.
Tout cela produit beaucoup de "tête de mort" dans DT. Un bouton pour pouvoir les selectionner d'un coup serait top !

Voila pour mon avis. En attendant, le script c'est déjà très bien, pour les photographes aux tendences geek comme moi.
Cela dis pas assez geek pour comprendre les différences entre les différences proposées par JeanLucDelacroix .-).
Ni pour comprendre pourquoi je n'y arrive pas.

J'ai utilisé purge_non_existing_images.sh  et aucun "skull" n'a été éffacé, j'ai toujours 24430 images dans DT, voici la sortie des commandes :
Code :
ngux@ngux-pc:~$ ./purge_non_existing_images.sh
./purge_non_existing_images.sh: 12: ./purge_non_existing_images.sh: sqlite3: not found
Removing the following non existent file(s):

Remove following now-empty filmrolls:
./purge_non_existing_images.sh: 45: ./purge_non_existing_images.sh: sqlite3: not found

to really remove non existing images from the database call:
./purge_non_existing_images.sh -p
ngux@ngux-pc:~$ ./purge_non_existing_images.sh -p
./purge_non_existing_images.sh: 12: ./purge_non_existing_images.sh: sqlite3: not found
Removing the following non existent file(s):
./purge_non_existing_images.sh: 41: ./purge_non_existing_images.sh: sqlite3: not found


le script de JeanLouis le bash me répond que je n'ai pas fermé DT, ce qui n'est pas le cas. J'ai bien vérifié dans HTop qu'il ne restait rien de DT.
Code :
ngux@ngux-pc:~$ ./purge_non_existing_images.gawk.sh -p
./purge_non_existing_images.gawk.sh: 13: ./purge_non_existing_images.gawk.sh: sqlite3: not found
Removing the following non existent file(s):
Please close darktable and run this script again.
./purge_non_existing_images.gawk.sh: 51: ./purge_non_existing_images.gawk.sh: sqlite3: not found
ngux@ngux-pc:~$

Que puis-je faire? merci
Photographe pro qui passe tout son workflow sous Linux.
Répondre
#10
(03-04-19, 07:08)Ngux a écrit : Je réactive ce sujet car il me parait aborder un point important d'UX de DT
Je crois que la fonction purger les images "tête de mort" devrait être un bouton dans DT et non un script purge_non_existing_images.sh
Lorsque que l'on est photographe pro comme moi on fait face à des montagnes d'images. La gestion des archives : dupliquer, changer les images de disques parcequ'ils sont vieux et peu rapide, reorganiser, renommer, supprimer le non-choix d'un reportage pas important après quelques mois, une fois que l'on est sûr que le client n'y reviendra pas, etc, etc... Toutes ces manip ne se font pas dans DT, qui comme les developpeurs le disent bien, n'est pas un systeme de fichier. Donc on utilise le systeme de fichier pour les transferts ou encore, pour ma part XnView pour elaguer, reorganiser les dossier, etc.
Tout cela produit beaucoup de "tête de mort" dans DT. Un bouton pour pouvoir les selectionner d'un coup serait top !

Que puis-je faire? merci

Bonjour Ngux,

Certes darktable n'est pas un système de gestion de fichiers mais il les gère tout de même très bien. A l'exception du renommage de fichiers (peu utile pour les RAW en général), il est possible de faire toutes les manipulations dont tu parles depuis darktable. C'est même recommandé de le faire via darktable plutôt que via l'OS, tout simplement parce que le faire depuis darktable permet la mise à jour de la base de données en même temps, donc d'éviter les "têtes de mort".

Tu peux faire toutes ces manipulations principalement depuis le module "images sélectionnées" de la table lumineuse :

- dupliquer s'appelle "copier"
- supprimer = "poubelle" (pour rappel, tu as dans les préférences de dt une option permettant de choisir si ça va à la poubelle ou si suppression définitive)
- "enlever" n'enlève que de la base de données donc uniquement de darktable, et laisse les fichiers à leur place sur ton disque dur
- etc...

Pour le renommage, tu peux le faire sur les RAW uniquement à l'import (depuis la carte mémoire ou l'appareil photo) et pour les JPG dans tous les cas à l'export.

Bref, le mieux est de réduire à la source ces têtes de mort en réduisant les manipulations depuis l'OS. Faisant toutes mes manipulations depuis darktable, je n'ai jamais de "tête de mort".

Pour le nettoyage que tu as à faire, je pense qu'il te manque un paquet (gawk et/ou sqlite3). A installer via un 'apt install gawk sqlite3'

Pour l'erreur te disant qu'il te faut fermer darktable, vérifies dans ton dossier .config/darktable si tu n'aurais pas un fichier de verrouillage .lock.
Aussi appelé Nilvus !
Debian Sid - darktable master
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 5 visiteur(s)