623 votes

Combien de fichiers puis-je mettre dans un répertoire?

Il n'importe combien de fichiers que j'ai garder dans un seul répertoire? Si oui, comment beaucoup de fichiers dans un répertoire, c'est trop, et quels sont les impacts d'avoir trop de fichiers? (C'est sur un serveur Linux.)

Contexte: j'ai un album photo de site web, et chaque image téléchargée est renommé pour 8 hex chiffres de l'id (par exemple, a58f375c.jpg). C'est pour éviter les conflits de nom de fichier (si beaucoup de "IMG0001.JPG" les fichiers sont téléchargés, par exemple). Le nom de fichier original et utile métadonnées sont stockées dans une base de données. Maintenant, j'ai quelque part autour de 1500 fichiers dans le répertoire d'images. Cela rend la liste des fichiers dans le répertoire (par FTP ou SSH client) prendre quelques secondes. Mais je ne peux pas voir qu'il n'a aucune incidence sur les autres que cela. En particulier, il ne semble pas y avoir d'impact sur la façon dont rapidement un fichier image est servi à l'utilisateur.

J'ai pensé à réduire le nombre d'images par faire des 16 sous-répertoires: 0-9 et a-f. Ensuite, j'ai déplacer les images dans les sous-répertoires en fonction de ce que le premier chiffre hexadécimal du nom de fichier est. Mais je ne suis pas sûr qu'il y a une raison de le faire sauf parfois la liste du répertoire via FTP/SSH.

828voto

ISW Points 4427

FAT32:

  • Nombre Maximum de fichiers: 268,173,300
  • Nombre Maximum de fichiers par dossier: 216 - 1 (de 65 535)
  • Taille de fichier maximale: 2 Go - 1 sans LFS, 4 Go - 1 avec

NTFS:

  • Nombre Maximum de fichiers: 232 - 1 (4,294,967,295)
  • Taille de fichier maximale
    • Mise en œuvre: 244 - 26 octets (16 TiB - 64 KiB)
    • Théorique: 264 - 26 octets (16 Bei - 64 KiB)
  • Le volume Maximum
    • Mise en œuvre: 232 - 1 les clusters (256 TiB - 64 KiB)
    • Théorique: 264 - 1 grappes

ext2:

  • Nombre Maximum de fichiers: 1018
  • Nombre Maximum de fichiers par répertoire: ~1.3 × 1020 (problèmes de performance passé de 10 000)
  • Taille de fichier maximale
    • 16 GiB (taille de bloc de 1 Ko)
    • 256 Go (taille de bloc de 2 Kio)
    • 2 TiB (taille de bloc de 4 Ko)
    • 2 TiB (taille de bloc de 8 KiB)
  • Le volume Maximum
    • 4 TiB (taille de bloc de 1 Ko)
    • 8 TiB (taille de bloc de 2 Kio)
    • 16 TiB (taille de bloc de 4 Ko)
    • 32 TiB (taille de bloc de 8 KiB)

ext3:

  • Nombre Maximum de fichiers: min(volumeSize / 213, numberOfBlocks)
  • Taille de fichier maximale: même en ext2
  • Le volume Maximum: même en ext2

ext4:

  • Nombre Maximum de fichiers: 232 - 1 (4,294,967,295)
  • Nombre Maximum de fichiers par dossier: illimité
  • Taille de fichier maximale: 244 - 1 octets (16 TiB - 1)
  • Le volume Maximum: 248 - 1 octets (256 TiB - 1)

209voto

Ben Points 1051

J'ai eu plus de 8 millions de fichiers ext3 répertoire. libc readdir() qui est utilisé par trouver, ls, et la plupart des autres méthodes décrites dans ce fil de liste de gros répertoires.

La raison ls et trouver sont lents dans ce cas, c'est que readdir() ne lit 32K les entrées de l'annuaire à la fois, sur la lenteur de disques qu'il faudra de nombreuses de nombreuses lectures sur la liste d'un répertoire. Il y a une solution à ce problème de vitesse. J'ai écrit un joli article détaillé à ce sujet: http://www.olark.com/spw/2011/08/you-can-list-a-directory-with-8-million-files-but-not-with-ls/

La clé de take-away: utilisation getdents() directement -- http://www.kernel.org/doc/man-pages/online/pages/man2/getdents.2.html plutôt que quelque chose qui est basé sur la libc readdir() de sorte que vous pouvez spécifier la taille de la mémoire tampon lors de la lecture des entrées du répertoire à partir du disque.

78voto

Sam Points 979

J'ai un répertoire avec 88,914 fichiers qu'il contient. Comme vous-même ce est utilisé pour stocker des miniatures et sur un serveur Linux.

Répertorié les fichiers via FTP ou une fonction php est lent, oui, mais il y a aussi un gain de performance sur l'affichage du fichier. par exemple www.website.com/thumbdir/gh3hg4h2b4h234b3h2.jpg a un temps d'attente de 200 à 400 ms. A titre de comparaison, sur un autre site que j'ai avec un autour de 100 fichiers dans un répertoire que l'image est affichée juste après ~40ms d'attente.

J'ai donné cette réponse comme la plupart des gens ont juste écrit comment le répertoire des fonctions de recherche va effectuer, que vous n'allez pas l'utiliser sur une clé dossier - seulement de manière statique l'affichage des fichiers, mais seront intéressés par les performances de la façon dont les fichiers peuvent être réellement utilisés.

57voto

Bart Schuller Points 1992

Ça dépend un peu sur le système de fichiers en cours d'utilisation sur le serveur Linux. Aujourd'hui, la valeur par défaut est ext3 avec dir_index, ce qui rend la recherche de gros répertoires très rapide.

Donc, la vitesse ne devrait pas être un problème, autre que l'un de vous l'a déjà noté, c'est que les listes de prendre plus de temps.

Il y a une limite au nombre total de fichiers dans un même répertoire. Je crois me souvenir qu'il certainement de travail jusqu'à 32000 fichiers.

49voto

Steve Kuo Points 15196

Gardez à l'esprit que sous Linux, si vous avez un répertoire avec un trop grand nombre de fichiers, le shell peut ne pas être en mesure d'étendre les jokers. J'ai ce problème avec un album de photos hébergées 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 peut pas. Exemple:

-shell-3.00$ ls A*
-shell: /bin/ls: Argument list too long

ou

-shell-3.00$ chmod 644 *jpg
-shell: /bin/chmod: Argument list too long

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X