Est-il important de savoir combien de fichiers je conserve dans un seul répertoire? Si c'est le cas, combien de fichiers dans un répertoire sont trop nombreux et quels sont les impacts d'avoir trop de fichiers? (Ceci est sur un serveur Linux.)
Contexte: J'ai un site d'album photo et chaque image téléchargée est renommée en un identifiant à 8 chiffres hexadécimaux (par exemple, a58f375c.jpg). Cela permet d'éviter les conflits de nom de fichier (si de nombreux fichiers "IMG0001.JPG" sont téléchargés, par exemple). Le nom de fichier d'origine et toutes les métadonnées utiles sont stockés dans une base de données. En ce moment, j'ai quelque part environ 1500 fichiers dans le répertoire images. Cela permet de répertorier les fichiers dans le répertoire (via le client FTP ou SSH) en quelques secondes. Mais je ne vois pas que cela ait un effet autre que celui-là. En particulier, il ne semble pas y avoir d'impact sur la rapidité avec laquelle un fichier image est servi à l'utilisateur.
J'ai pensé à réduire le nombre d'images en créant 16 sous-répertoires: 0-9 et af. Ensuite, je déplacerais les images dans les sous-répertoires en fonction de ce qu'était le premier chiffre hexadécimal du nom de fichier. Mais je ne suis pas sûr qu'il y ait une raison de le faire, sauf pour la liste occasionnelle du répertoire via FTP / SSH.
J'ai eu plus de 8 millions de fichiers dans un seul répertoire ext3. libc
readdir()
qui est utilisé parfind
,ls
et la plupart des autres méthodes discutées dans ce fil pour lister les grands répertoires.La raison
ls
etfind
lenteur dans ce cas est quereaddir()
ne lit que 32 Ko d'entrées de répertoire à la fois, donc sur des disques lents, il faudra de nombreuses lectures pour répertorier un répertoire. Il existe une solution à ce problème de vitesse. J'ai écrit un article assez détaillé à ce sujet sur: http://www.olark.com/spw/2011/08/you-can-list-a-directory-with-8-million-files-but-not-with- ls /La clé à retenir est: utiliser
getdents()
directement - http://www.kernel.org/doc/man-pages/online/pages/man2/getdents.2.html plutôt que tout ce qui est basé sur libcreaddir()
afin que vous puissiez spécifier le tampon taille lors de la lecture des entrées du répertoire à partir du disque.la source
J'ai un répertoire contenant 88 914 fichiers. Comme vous, ceci est utilisé pour stocker des miniatures et sur un serveur Linux.
Les fichiers répertoriés via FTP ou une fonction php sont lents oui, mais il y a également un impact sur les performances lors de l'affichage du fichier. Par exemple, www.website.com/thumbdir/gh3hg4h2b4h234b3h2.jpg a un temps d'attente de 200 à 400 ms. À titre de comparaison sur un autre site que j'ai avec environ 100 fichiers dans un répertoire, l'image s'affiche après seulement ~ 40 ms d'attente.
J'ai donné cette réponse car la plupart des gens viennent d'écrire comment les fonctions de recherche de répertoire fonctionneront, que vous n'utiliserez pas sur un dossier miniature - affichant simplement des fichiers statiquement, mais seront intéressés par les performances de la façon dont les fichiers peuvent être réellement utilisés .
la source
Cela dépend un peu du système de fichiers spécifique utilisé sur le serveur Linux. De nos jours, la valeur par défaut est ext3 avec dir_index, ce qui rend la recherche de grands répertoires très rapide.
La vitesse ne devrait donc pas être un problème, autre que celui que vous avez déjà noté, à savoir que les listes prendront plus de temps.
Il y a une limite au nombre total de fichiers dans un répertoire. Il me semble que cela fonctionne sans aucun doute jusqu'à 32 000 fichiers.
la source
dir_index
activé. J'avais environ 17 millions de fichiers dans le répertoire. La réponse a été d'activerlarge_dir
avec tune2fs.Gardez à l'esprit que sous Linux, si vous avez un répertoire avec trop de fichiers, le shell peut ne pas être en mesure de développer des caractères génériques. J'ai ce problème avec un album photo hébergé sur Linux. Il stocke toutes les images redimensionnées dans un seul répertoire. Alors que le système de fichiers peut gérer de nombreux fichiers, le shell ne le peut pas. Exemple:
ou
la source
exec
implémentation du système . Le shell peut généralement développer le caractère générique très bien - c'est l'appel àexec
autant d'arguments qui renvoie l'erreur.Je travaille sur un problème similaire en ce moment. Nous avons une structure de répertoires hiérarchique et utilisons des identifiants d'image comme noms de fichiers. Par exemple, une image avec
id=1234567
est placée dansen utilisant les 4 derniers chiffres pour déterminer où va le fichier.
Avec quelques milliers d'images, vous pouvez utiliser une hiérarchie à un niveau. Notre administrateur système n'a suggéré que quelques milliers de fichiers dans un répertoire donné (ext3) pour des raisons d'efficacité / de sauvegarde / quelles que soient les autres raisons qu'il avait en tête.
la source
Pour ce que ça vaut, je viens de créer un répertoire sur un
ext4
système de fichiers contenant 1 000 000 de fichiers, puis j'ai accédé au hasard à ces fichiers via un serveur Web. Je n'ai remarqué aucune prime sur l'accès à ceux-ci (disons) avec seulement 10 fichiers là-bas.C'est radicalement différent de mon expérience de faire cela il y
ntfs
a quelques années.la source
Le plus gros problème que j'ai rencontré concerne un système 32 bits. Une fois que vous avez dépassé un certain nombre, des outils comme «ls» cessent de fonctionner.
Essayer de faire quoi que ce soit avec ce répertoire une fois que vous avez franchi cette barrière devient un énorme problème.
la source
J'ai eu le même problème. Essayer de stocker des millions de fichiers sur un serveur Ubuntu en ext4. Fin de l'exécution de mes propres repères. J'ai découvert que le répertoire plat fonctionne bien mieux tout en étant plus simple à utiliser:
A écrit un article .
la source
Si le temps nécessaire à l'implémentation d'un schéma de partitionnement d'annuaire est minime, je suis en faveur de celui-ci. La première fois que vous devrez déboguer un problème impliquant la manipulation d'un répertoire de 10000 fichiers via la console, vous comprendrez.
Par exemple, F-Spot stocke les fichiers photo sous la forme AAAA \ MM \ JJ \ nom_fichier.ext, ce qui signifie que le plus grand répertoire auquel j'ai dû faire face lors de la manipulation manuelle de ma collection de ~ 20000 photos est d'environ 800 fichiers. Cela rend également les fichiers plus faciles à parcourir à partir d'une application tierce. Ne présumez jamais que votre logiciel est la seule chose qui accède aux fichiers de votre logiciel.
la source
Cela dépend absolument du système de fichiers. De nombreux systèmes de fichiers modernes utilisent des structures de données décentes pour stocker le contenu des répertoires, mais les systèmes de fichiers plus anciens venaient souvent d'ajouter les entrées à une liste, donc la récupération d'un fichier était une opération O (n).
Même si le système de fichiers le fait correctement, il est toujours possible pour les programmes qui répertorient le contenu des répertoires de se tromper et de faire un tri O (n ^ 2), donc pour être sûr, je limiterais toujours le nombre de fichiers par répertoire à pas plus de 500.
la source
Cela dépend vraiment du système de fichiers utilisé, ainsi que de certains indicateurs.
Par exemple, ext3 peut contenir plusieurs milliers de fichiers; mais après quelques milliers, c'était très lent. Surtout lors de la liste d'un répertoire, mais aussi lors de l'ouverture d'un seul fichier. Il y a quelques années, il a gagné l'option «htree», qui a considérablement raccourci le temps nécessaire pour obtenir un inode donné un nom de fichier.
Personnellement, j'utilise des sous-répertoires pour garder la plupart des niveaux sous un millier d'articles. Dans votre cas, je créerais 256 répertoires, avec les deux derniers chiffres hexadécimaux de l'ID. Utilisez les derniers chiffres et non les premiers, pour équilibrer la charge.
la source
ext3 a en fait des limites de taille de répertoire, et elles dépendent de la taille de bloc du système de fichiers. Il n'y a pas de "nombre maximal" de fichiers par répertoire, mais un "nombre maximal de blocs par répertoire utilisé pour stocker les entrées de fichiers". Plus précisément, la taille du répertoire lui-même ne peut pas dépasser une arborescence b de hauteur 3 et le fanout de l'arborescence dépend de la taille du bloc. Voir ce lien pour quelques détails.
https://www.mail-archive.com/[email protected]/msg01944.html
J'ai récemment été mordu par cela sur un système de fichiers formaté avec des blocs 2K, qui recevait inexplicablement les messages du noyau plein de répertoires
warning: ext3_dx_add_entry: Directory index full!
lorsque je copiais à partir d'un autre système de fichiers ext3. Dans mon cas, un répertoire contenant à peine 480 000 fichiers n'a pas pu être copié vers la destination.la source
La question se résume à ce que vous allez faire avec les fichiers.
Sous Windows, tout répertoire contenant plus de 2 000 fichiers a tendance à s'ouvrir lentement pour moi dans l'Explorateur. S'ils sont tous des fichiers image, plus de 1 Ko ont tendance à s'ouvrir très lentement en vue miniature.
À un moment donné, la limite imposée par le système était de 32 767. Il est plus élevé maintenant, mais même cela représente beaucoup trop de fichiers à gérer à la fois dans la plupart des circonstances.
la source
Ce que la plupart des réponses ci-dessus ne montrent pas, c'est qu'il n'y a pas de réponse «Taille unique» à la question d'origine.
Dans l'environnement actuel, nous avons un grand conglomérat de différents matériels et logiciels - certains 32 bits, certains 64 bits, certains de pointe et certains éprouvés - fiables et sans changement. À cela s'ajoutent une variété de matériel ancien et plus récent, des systèmes d'exploitation plus anciens et plus récents, différents fournisseurs (Windows, Unixes, Apple, etc.) et une myriade d'utilitaires et de serveurs qui vont avec. Au fur et à mesure que le matériel s'est amélioré et que le logiciel est converti en compatibilité 64 bits, il y a forcément eu un retard considérable pour que toutes les pièces de ce monde très vaste et complexe jouent bien avec le rythme rapide des changements.
À mon humble avis, il n'y a pas une seule façon de résoudre un problème. La solution consiste à rechercher les possibilités, puis par essais et erreurs à trouver ce qui convient le mieux à vos besoins particuliers. Chaque utilisateur doit déterminer ce qui fonctionne pour son système plutôt que d'utiliser une approche de cookie cutter.
J'ai par exemple un serveur multimédia avec quelques très gros fichiers. Le résultat est seulement environ 400 fichiers remplissant un lecteur de 3 To. Seulement 1% des inodes sont utilisés mais 95% de l'espace total est utilisé. Quelqu'un d'autre, avec beaucoup de fichiers plus petits, peut manquer d'inodes avant de se rapprocher de l'espace. (Sur les systèmes de fichiers ext4, en règle générale, 1 inode est utilisé pour chaque fichier / répertoire.) Alors que théoriquement le nombre total de fichiers pouvant être contenus dans un répertoire est presque infini, l'aspect pratique détermine que l'utilisation globale détermine des unités réalistes, pas juste des capacités de système de fichiers.
J'espère que toutes les différentes réponses ci-dessus ont favorisé la réflexion et la résolution de problèmes plutôt que de présenter un obstacle insurmontable au progrès.
la source
Je me souviens avoir exécuté un programme qui créait une énorme quantité de fichiers à la sortie. Les fichiers ont été triés à 30000 par répertoire. Je ne me souviens pas avoir eu de problèmes de lecture lorsque j'ai dû réutiliser la sortie produite. C'était sur un ordinateur portable Ubuntu Linux 32 bits, et même Nautilus affichait le contenu du répertoire, quoique après quelques secondes.
Système de fichiers ext3: un code similaire sur un système 64 bits traitait bien 64 000 fichiers par répertoire.
la source
"Dépend du système de fichiers"
Certains utilisateurs ont mentionné que l'impact sur les performances dépend du système de fichiers utilisé. Bien sûr. Les systèmes de fichiers comme EXT3 peuvent être très lents. Mais même si vous utilisez EXT4 ou XFS, vous ne pouvez pas empêcher que la liste d'un dossier via
ls
oufind
ou via une connexion externe comme FTP devienne plus lente et plus lente.Solution
Je préfère la même manière que @armandino . Pour cela, j'utilise cette petite fonction en PHP pour convertir les identifiants en un chemin de fichier qui génère 1000 fichiers par répertoire:
ou vous pouvez utiliser la deuxième version si vous souhaitez utiliser des caractères alphanumériques:
résultats:
Comme vous pouvez le voir pour la
$int
version-chaque dossier contient jusqu'à 1000 fichiers et jusqu'à 99 répertoires contenant 1000 fichiers et 99 répertoires ...Mais n'oubliez pas que de nombreux répertoires provoquent les mêmes problèmes de performances!
Enfin, vous devriez réfléchir à la façon de réduire le nombre total de fichiers. Selon votre cible, vous pouvez utiliser des sprites CSS pour combiner plusieurs petites images comme des avatars, des icônes, des smileys, etc. ou si vous utilisez de nombreux petits fichiers non multimédias, envisagez de les combiner, par exemple au format JSON. Dans mon cas, j'avais des milliers de mini-caches et j'ai finalement décidé de les combiner en packs de 10.
la source
Je respecte cela ne répond pas totalement à votre question sur le nombre, mais une idée pour résoudre le problème à long terme est qu'en plus de stocker les métadonnées du fichier d'origine, stockez également le dossier sur le disque dans lequel il est stocké - normaliser sur ce morceau de métadonnées. Une fois qu'un dossier se développe au-delà d'une certaine limite avec laquelle vous êtes à l'aise pour les performances, l'esthétique ou autre, vous créez simplement un deuxième dossier et commencez à y déposer des fichiers ...
la source
J'ai rencontré un problème similaire. J'essayais d'accéder à un répertoire contenant plus de 10 000 fichiers. La création de la liste de fichiers et l'exécution de tout type de commandes sur l'un des fichiers prenaient trop de temps.
J'ai imaginé un petit script php pour le faire moi-même et j'ai essayé de trouver un moyen de l'empêcher de s'arrêter dans le navigateur.
Voici le script php que j'ai écrit pour résoudre le problème.
Liste des fichiers dans un répertoire contenant trop de fichiers pour FTP
Comment cela aide quelqu'un
la source
Pas une réponse, mais juste quelques suggestions.
Sélectionnez un FS (système de fichiers) plus approprié. Étant donné que d'un point de vue historique, tous vos problèmes étaient suffisamment judicieux pour être jadis au cœur des SF évoluant au fil des décennies. Je veux dire que les FS plus modernes prennent mieux en charge vos problèmes. Faites d'abord un tableau de décision de comparaison basé sur votre objectif ultime à partir de la liste FS .
Je pense qu'il est temps de changer vos paradigmes. Je suggère donc personnellement d'utiliser un système distribué conscient de FS , ce qui signifie aucune limite en ce qui concerne la taille, le nombre de fichiers, etc. Sinon, vous serez tôt ou tard confronté à de nouveaux problèmes imprévus.
Je ne suis pas sûr de travailler, mais si vous ne mentionnez pas d'expérimentation, essayez AUFS sur votre système de fichiers actuel. Je suppose qu'il a des installations pour imiter plusieurs dossiers en un seul dossier virtuel.
Pour surmonter les limites matérielles, vous pouvez utiliser RAID-0.
la source
Il n'y a pas un seul chiffre qui soit «trop», tant qu'il ne dépasse pas les limites du système d'exploitation. Cependant, plus il y a de fichiers dans un répertoire, quel que soit le système d'exploitation, plus il faut de temps pour accéder à un fichier individuel, et sur la plupart des systèmes d'exploitation, les performances sont non linéaires, donc trouver un fichier sur 10 000 prend plus de 10 fois plus de temps puis pour trouver un fichier en 1000.
Les problèmes secondaires associés à la présence de nombreux fichiers dans un répertoire incluent les échecs d'extension des caractères génériques. Pour réduire les risques, vous pourriez envisager de commander vos répertoires par date de téléchargement, ou tout autre élément utile de métadonnées.
la source