Développement

Spotlight trop lent ?

Retour sur Spotlight, et sur quelques découvertes intéressantes...

Ils existent de tres nombreux attributs Spotlight (
liste complète). J'ai rencontré un problème de performance avec l'un d'eux: kMDItemFSCreationDate.

Cet attribut correspond à la date de •création• du fichier, tous fichiers sur le disque possèdent donc cet attribut.

Seulement cet attribut ne semble pas indexé comme la plupart des attributs Spotlight. Lorsque vous faites une requete sur cet attribut le temps de réalisation de la requête augmente dramatiquement.
Si par exemple on cherche tous les emails (fichier de type emlx) crée par Mail depuis 10 jours (cf "Spotlight déraille") :

$: time mdfind  -onlyin ~/Library/Mail/ "kMDItemContentType == 'com.apple.mail.emlx' &&  kMDItemFSCreationDate > 275824405"

Le temps d'exécution de cette requêtes est d'environ 1 min et 30 secondes pour a peine 1 Go d'email ! Spotlight est normalement beaucoup plus rapide. De plus on entend le disque "gratter" et les ventilateurs de la machine s'emballent...

Il existe un autre attribut, proche mais différent kMDItemContentCreationDate qui lui est indexé correctement. Il correspond à la date de création du *contenu* du fichier pas à la création du fichier lui même. Par exemple, si j'achète un nouveau Mac, que je configure Mail pour récupérer mes emails, Mail va me créeer des fichiers avec une date "ajourd'hui" mais le *contenu* de mes emails ne date pas d'ajourd'hui... Ainsi la date de création du *contenu* est pour un message email, la date de son envoi (ou de sa réception).

Il y'a certes une différence majeur de sémantique de la date de création et les 2 attributs ne sont pas interchangeables, mais si vous pouvez utiliser cet attribut
kMDItemContentCreationDate les performances de Spotlight sont alors au rendez vous :

$: time mdfind  -onlyin ~/Library/Mail/ "kMDItemContentType == 'com.apple.mail.emlx' &&  kMDItemContentCreationDate > 275824405"

Le temps d'exécution de cette requêtes est systématiquement sous la barre des 2 secondes ! impressionant !
|

Spotlight déraille

Spotlight est une techno extrêmement utile pour les utilisateurs (je ne peux plus m'em passer pour retrouver des emails ou des documents que j'utilise rarement), mais aussi pour les développeurs ! Je m'en sers beaucoup en ce moment, et j'ai trouvé quelques perles....

Du nom de son projet d'origine (matador), probablement à cause des "metadatas", OS X nous offre différentes APIs pour faire des requêtes Spotlight dont ma préférée : MDQueryRef que l'on programme en Core Foundation.

Mais il est aussi possible de faire des requetes via la ligne de commande (pour réaliser des scripts par exemple). Malheureusement la commande
mdfind semble ne pas bien supporter l'ensemble de la syntaxe des requêtes Spotlight decrite ici

$: mdfind  "kMDItemFSCreationDate >  $time.today(-10)"

Cette commande est censé nous retourner tous les fichiers indexés donc le contenu à été crée il y a 10 jours.
Spotlight propose dans son API diverses variables comme $time.now , $time.this_week etc... auxquelles ont peut ajouter "(UN_NOMBRE)" pour effectuer des calculs temporels.

Sauf qu'en ligne de commande ces variables ne sont pas prise en compte, ne génerent pas d'erreur, mais terminent la requête immédiatement !

La solution est de calculer soit meme la date et de la convertir en nombre de seconde depuis... le 01/01/2001... et oui pas depuis 1970 comme (tous?) les unix...

$: mdfind  "kMDItemFSCreationDate > 275824405"

275824405 correspond au nombre de secondes depuis le 01/01/2001 jusqu'à il y a 10 jours (à la date de création de ce post...)

Il semble que depuis 10.6 (Snow Leopard), meme les APIs plus bas niveau (MDQueryRef) ne convertissent plus ces variables en date. A nous donc de faire le travail...

|