Question

Un produit sur lequel je travaille recueille plusieurs milliers de lectures par jour et les stocke sous forme de fichiers binaires 64k sur une partition NTFS (Windows XP). Après une année de production, il y a plus de 300 000 fichiers dans un seul répertoire et ce nombre ne cesse de croître. L’accès aux répertoires parent / ancêtre à partir de l’explorateur Windows prend donc beaucoup de temps.

J'ai essayé de désactiver le service d'indexation, mais cela ne faisait aucune différence. J'ai également envisagé de déplacer le contenu du fichier dans une base de données / fichiers zip / tarballs, mais il est avantageux pour nous d'accéder aux fichiers individuellement; fondamentalement, les fichiers sont toujours nécessaires à des fins de recherche et les chercheurs ne sont pas disposés à traiter avec autre chose.

Existe-t-il un moyen d’optimiser NTFS ou Windows pour qu’il puisse fonctionner avec tous ces petits fichiers?

Était-ce utile?

La solution

Les performances NTFS se dégradent gravement après 10 000 fichiers dans un répertoire. Ce que vous faites est de créer un niveau supplémentaire dans la hiérarchie des répertoires, chaque sous-répertoire contenant 10 000 fichiers.

Pour ce qui en vaut la peine, c’est l’approche adoptée par les responsables SVN pour version 1.5 . Ils ont utilisé 1 000 fichiers comme seuil par défaut.

Autres conseils

NTFS fonctionnera correctement avec plus de 10 000 fichiers dans un répertoire, à condition que vous lui ordonniez de ne plus créer de noms de fichiers compatibles avec les plates-formes Windows 16 bits. Par défaut, NTFS crée automatiquement un nom de fichier «8 points 3» pour chaque fichier créé. Cela devient un problème lorsque de nombreux fichiers se trouvent dans un répertoire, car Windows les examine pour s’assurer que le nom qu’ils créent n’est pas déjà utilisé. Vous pouvez désactiver le nommage «8 points 3» en définissant la valeur de registre NtfsDisable8dot3NameCreation sur 1. La valeur se trouve dans le chemin de registre HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ FileSystem. Vous pouvez effectuer cette modification en toute sécurité, car les fichiers de noms «8 points 3» ne sont requis que par les programmes écrits pour de très anciennes versions de Windows.

Un redémarrage est requis pour que ce paramètre prenne effet.

Le problème de performances est causé par la quantité énorme de fichiers dans un seul répertoire: une fois que vous avez éliminé ce problème, tout devrait bien se passer. Ce n'est pas un problème spécifique à NTFS: en fait, il est couramment rencontré avec les fichiers de courrier électronique de l'utilisateur sur les grands systèmes UNIX.

Un moyen évident de résoudre ce problème consiste à déplacer les fichiers dans des dossiers portant un nom basé sur le nom du fichier. En supposant que tous vos fichiers ont des noms de fichier de longueur similaire, par exemple. ABCDEFGHI.db, ABCEFGHIJ.db, etc., créez une structure de répertoire comme celle-ci:

ABC\
    DEF\
        ABCDEFGHI.db
    EFG\
        ABCEFGHIJ.db

Cette structure vous permet de localiser rapidement un fichier en fonction de son nom. Si les noms de fichier ont des longueurs variables, choisissez une longueur maximale et ajoutez des zéros (ou tout autre caractère) avant de spécifier le répertoire dans lequel le fichier appartient.

J'ai constaté de grandes améliorations dans le passé, consistant à scinder les fichiers en une hiérarchie imbriquée de répertoires, par exemple en commençant par la seconde lettre du nom de fichier; alors chaque répertoire ne contient pas un nombre excessif de fichiers. La manipulation de toute la base de données reste toutefois lente.

Vous pouvez essayer d'utiliser quelque chose comme Solid File System.

Cela vous donne un système de fichiers virtuel que les applications peuvent monter comme s'il s'agissait d'un disque physique. Votre application voit beaucoup de petits fichiers, mais un seul fichier se trouve sur votre disque dur.

http://www.eldos.com/solfsdrv/

Si vous pouvez calculer les noms de fichiers, vous pourrez peut-être les trier en dossiers par date afin que chaque dossier ne contienne que des fichiers pour une date donnée. Vous pouvez également créer des hiérarchies de mois et d’années.

De plus, pouvez-vous déplacer des fichiers plus anciens que, disons, une année, vers un emplacement différent (mais toujours accessible)?

Enfin et encore, cela nécessite que vous soyez capable de calculer des noms, vous constaterez que l'accès direct à un fichier est beaucoup plus rapide que d'essayer de l'ouvrir via l'explorateur. Par exemple, en disant
notepad.exe " P: \ ath \ to \ your \ filen.ame "
à partir de la ligne de commande devrait être assez rapide, à condition de connaître le chemin du fichier dont vous avez besoin sans avoir à obtenir une liste de répertoires.

Une astuce courante consiste simplement à créer une poignée de sous-répertoires et à diviser les fichiers.

Par exemple, Doxygen, un programme de documentation de code automatisé pouvant générer des tonnes de pages HTML, dispose d’une option permettant de créer une hiérarchie de répertoires profonds à deux niveaux. Les fichiers sont ensuite répartis uniformément dans les répertoires inférieurs.

Le fait de disposer de centaines de milliers de fichiers dans un seul répertoire paralysera NTFS, et vous ne pouvez pas grand-chose à faire à ce sujet. Vous devriez reconsidérer le stockage des données dans un format plus pratique, comme une grande archive ou dans une base de données.

Si vous avez vraiment besoin d'un fichier séparé pour chaque lecture, vous devez les trier en plusieurs sous-répertoires au lieu de les avoir tous dans le même répertoire. Vous pouvez le faire en créant une hiérarchie de répertoires et en plaçant les fichiers dans des fichiers différents en fonction du nom du fichier. De cette façon, vous pouvez toujours stocker et charger vos fichiers en ne connaissant que le nom du fichier.

La méthode que nous utilisons consiste à prendre les dernières lettres du nom du fichier, à les inverser et à créer des répertoires à une lettre à partir de cela. Considérez les fichiers suivants par exemple:

1.xml
24.xml
12331.xml
2304252.xml

vous pouvez les trier dans des répertoires comme suit:

data/1.xml
data/24.xml
data/1/3/3/12331.xml
data/2/5/2/4/0/2304252.xml

Ce schéma garantira que vous ne disposerez jamais de plus de 100 fichiers dans chaque répertoire.

J'ai rencontré ce problème plusieurs fois dans le passé. Nous avons essayé de stocker par date, en compressant les fichiers en dessous de la date, de manière à ne pas avoir beaucoup de petits fichiers, etc. Tous étaient des bandaids du réel problème de stockage des données sous forme de beaucoup de petits fichiers sur NTFS.

Vous pouvez accéder à ZFS ou à un autre système de fichiers qui gère mieux les petits fichiers, mais vous devez quand même vous arrêter et demander si vous devez BESOIN de stocker les petits fichiers.

Dans notre cas, nous avons finalement opté pour un système dans lequel tous les petits fichiers d’une certaine date ont été ajoutés de la même manière que les fichiers TAR, avec de simples séparateurs pour les analyser. Les fichiers sur disque sont passés de 1,2 million à moins de quelques milliers. Ils ont en fait chargé plus rapidement parce que NTFS ne peut pas très bien gérer les petits fichiers et que le lecteur était mieux à même de mettre en cache un fichier de 1 Mo. Dans notre cas, le temps d'accès et d'analyse pour trouver la bonne partie du fichier était minime comparé au stockage et à la maintenance réels des fichiers stockés.

En plus de placer les fichiers dans des sous-répertoires ..

Personnellement, je développerais une application qui garde l'interface de ce dossier identique, c'est-à-dire que tous les fichiers sont affichés comme étant des fichiers individuels. Ensuite, dans l’arrière-plan de l’application, ces fichiers sont combinés et combinés en un fichier plus volumineux (et puisque les tailles sont toujours de 64 Ko, obtenir les données dont vous avez besoin devrait être relativement facile). Pour vous débarrasser du fouillis que vous avez.

Vous pouvez donc toujours leur faciliter l’accès aux fichiers qu’ils veulent, mais vous permet également de mieux contrôler la structure de tout.

Envisagez de les transférer sur un autre serveur utilisant un système de fichiers plus convivial pour des quantités massives de petits fichiers (Solaris w / ZFS par exemple)?

S'il existe des aspects des données significatifs et catégoriques, vous pouvez les imbriquer dans une arborescence de répertoires. Je crois que le ralentissement est dû au nombre de fichiers dans un répertoire, pas au nombre de fichiers lui-même.

Le regroupement général le plus évident est la date et vous fournit une structure de nidification à trois niveaux (année, mois, jour) avec une limite relativement sûre sur le nombre de fichiers dans chaque répertoire feuille (1-3k).

Même si vous êtes en mesure d’améliorer les performances du système de fichiers / du navigateur de fichiers, il semble que ce soit un problème que vous rencontrerez dans 2 ans, ou 3 ans ... il suffit de regarder une liste de il y aura peut-être un coût pour trouver un moyen de ne regarder que les plus petits sous-ensembles de fichiers.

L'utilisation d'outils tels que 'find' (sous cygwin ou mingw) peut supprimer la présence de l'arborescence de sous-répertoires lors de la navigation dans les fichiers.

Renommez chaque jour le dossier avec un horodatage.

Si l'application enregistre les fichiers dans c: \ Readings, configurez une tâche planifiée pour renommer Reading à minuit et créer un nouveau dossier vide.

Vous obtiendrez ensuite un dossier par jour, contenant plusieurs milliers de fichiers.

Vous pouvez étendre la méthode au groupe par mois. Par exemple, C: \ Reading devient c: \ Archive \ September \ 22.

Vous devez faire attention à votre minutage pour vous assurer que vous n'essayez pas de renommer le dossier pendant que le produit l'enregistre.

Pour créer une structure de dossiers pouvant s’adapter à un grand nombre de fichiers inconnu, j’aime le système suivant:

Divisez le nom de fichier en morceaux de longueur fixe, puis créez des dossiers imbriqués pour chaque morceau, sauf le dernier.

L’avantage de ce système est que la profondeur de la structure du dossier n’augmente que jusqu’à la longueur du nom du fichier. Donc, si vos fichiers sont automatiquement générés dans une séquence numérique, la structure n’est que profonde, il faut que ce soit.

12.jpg -> 12.jpg
123.jpg -> 12\123.jpg
123456.jpg -> 12\34\123456.jpg

Cette approche signifie que les dossiers contiennent des fichiers et des sous-dossiers, mais je pense que c'est un compromis raisonnable.

Et voici un magnifique PowerShell one-liner pour vous aider à démarrer!

$s = '123456'

-join  (( $s -replace '(..)(?!$)', '$1\' -replace '[^\\]*,'' ), $s )
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top