Il me semblait avoir vu qu'on pouvait indiquer à Windows de ne PAS
maintenir le tri de l'index d'un répertoire particulier (comme il le
fait par défaut), en y mettant un attribut particulier (dans ce cas,
l'index devient une simple liste à parcourir du début à la fin). Pour
des répertoires qui ont de très nombreux fichiers mis à jour très
souvent, ce tri est plus coûteux qu'utile. Mais je ne retrouve plus
l'API sur MSDN.
Malgré tout, si un dossier n'est pas trié, il se pose le problème du
temps de parcours en entier du répertoire avant d'y créer une nouvelle
entrée (sinon il y aurait création d'un doublon), ou pour y retrouver
rapidement un fichier par son nom (c'est ce que fait JTiles puisque'il
n'organise pas du tout ce dossier où il stocke dans un unique dossier
pour chaque fournisseur TMS toutes les tuiles de tous les niveaux de
zoom et de n'importe quelle valeur de x et y).
Comme JTiles est incapable de faire le ménage (il doit y avoir eu du
code pour ça, mais visiblement il ne marche plus ou n'est plus
activé), la seule façon de faire cela efficacement serait que JTiles
divise son cache en sous-dossiers de sorte qu'il n'y ait jamais plus
d'environ 2000 fichiers par sous-dossier. Comment faire ? Déjà il
pourrait créer un niveau de dossier pour le niveau de zoom.
Supposons la limite à entrées par dossier : le niveau de zoom 5 tient
en entier dedans pour toute la planète (je suppose que les tags s'il y
en a sont comptés à part, ils peuvent être aussi stockés à part dans
un unique fichier index "tags"), et les niveaux 0 à 4 tiennent aussi
dans cette limite. Pour le niveau 6 il faudra 4 sous-dossiers, mais le
nombre de sous-dossiers va être multiplié par 4 à chaque niveau de
zoom suivant. On tient jusqu'au niveau de zoom 10.
Après il faudra augmenter la hiérarchie avec un autre niveau de
sous-dossier jusqu'au niveau de zoom 15.
Mais à la longue on a alors plein de niveaux de sous-dossiers, plus ou
moins pleins, et toujours rien pour faire le ménage.

La solution est alors de stocker toujours 2048 entrées par dossier
mais stocker tous les dossiers à plat en nombre fini (par exemple 256
sous-dossiers (ce qui fera tout de même 512 000 fichiers, on a de la
marge pour un cache confortable !). Pour savoir dans quel sous-dossier
stocker ou trouver un fichier, un simple hachage de son nom suffit !

A la suite de quoi tous les dossiers ont une taille raisonnable, ils
sont maintenus très rapidement, on peut les lister de façon répétée de
façon exhaustive pour y faire le ménage. Le cache peut alors se
nettoyer tout seul pour respecter les contraintes de taille totale ou
purger les fichiers obsolètes (les fichiers tags sont remplacés par un
fichier index unique stockant les métadonnées HTTP, pas seulement les
ETag, mais aussi les dates d'obsolescence si nécessaire, bien qu(on
puisse aussi décider de rendre tous les fichiers obsolètes une semaine
après leur création, à moins qu'on les "touche" pour les garder en
faisant des requêtes HEAD au serveur)

Note: sous NTFS un dossier de 2048 entrées prend 512Ko d'index dans la
MFT, non compris les attributs longs ou les données de fichiers courts
comme les Etags justement qui sont aussi stockés directement dans la
même entrée de la MFT sans espace externe supplémentaire). S'y ajoute
pour ce dossier un index de tri (sous-forme de B-arbre) qui prend en
gros 128Ko (et permet des accès directs rapides à un fichier par son
nom). Les suppressions ou ajouts dans un tel dossier ne demandent que
peu d'I/O et pas trop d'opération en mémoire. En revanche pour un
dossier de plus de 60000 entrées (fois 2 avec les fichiers Etag), cela
commence à swapper énormément en mémoire et sollicite beaucoup trop
les caches disques, à cause des opérations de maintenance du B-arbre
(pour maintenir ses critères d'équilibre).

Le 4 février 2013 23:45, Vincent de Chateau-Thierry <v...@laposte.net> a écrit :
>
> Le 04/02/2013 23:37, Philippe Verdy a écrit :
>
>> Merci mais je connaissais déjà la solution
>
>
> C'est bien à ton mail que je répondais, mais c'était surtout une réponse à
> la question de Romain.
>
>
> vincent
>
> _______________________________________________
> Talk-fr mailing list
> Talk-fr@openstreetmap.org
> http://lists.openstreetmap.org/listinfo/talk-fr

_______________________________________________
Talk-fr mailing list
Talk-fr@openstreetmap.org
http://lists.openstreetmap.org/listinfo/talk-fr

Répondre à