Nombre Maximum de fichiers/répertoires sous Linux?
Je suis l'élaboration d'une LAMPE de boutique en ligne, qui permettra aux admins pour télécharger plusieurs images pour chaque élément.
Mon souci c'est - à droite au large de la chauve-souris, il y aura 20000 éléments de signification environ 60000 images.
Questions:
-
Quel est le nombre maximum de fichiers et/ou répertoires sous Linux?
-
Quelle est la manière habituelle de traiter cette situation (les bonnes pratiques)?
Mon idée était de faire un répertoire pour chaque élément, en fonction de son ID unique, mais je vais encore avoir 20000 annuaires dans l'un des principaux uploads répertoire, et il va croître indéfiniment, comme les anciens éléments ne sont pas supprimés.
Merci pour toute aide.
Vous devez vous connecter pour publier un commentaire.
ext[234] les systèmes de fichiers ont un nombre maximum fixe d'inodes; chaque fichier ou répertoire nécessite un inode. Vous pouvez voir le nombre et les limites avec
df -i
. Par exemple, sur un 15 GO système de fichiers ext3, créé avec les paramètres par défaut:Il n'y a pas de limite sur les annuaires en particulier au-delà; gardez à l'esprit que chaque fichier ou répertoire nécessite au moins un bloc de système de fichiers (généralement de 4 ko), bien que, même si c'est un répertoire avec un seul élément en elle.
Comme vous pouvez le voir, cependant, de 80 000 inodes est peu probable d'être un problème. Et avec le
dir_index
option (enablable avectune2fs
), les recherches dans les grands répertoires ne sont pas trop une grosse affaire. Toutefois, notez que de nombreux outils d'administration (commels
ourm
) peuvent avoir un moment difficile de traiter avec les répertoires avec un trop grand nombre de fichiers en eux. En tant que tel, il est recommandé de diviser vos fichiers de sorte que vous n'avez pas plus de quelques centaines à un millier d'éléments de n'importe quel répertoire donné. Un moyen facile de faire cela est de hachage quelle que soit l'ID que vous utilisez, et d'utiliser les premiers chiffres hexadécimaux que les répertoires intermédiaires.Par exemple, disons que vous avez l'ID de l'élément 12345, et il hachages pour
'DEADBEEF02842.......'
. Vous pouvez stocker vos fichiers sous/storage/root/d/e/12345
. Vous avez maintenant de réduire le nombre de fichiers dans chaque répertoire par 1/256e.[0-9a-f]
pour les deux chiffres.Si votre serveur de système de fichiers a la
dir_index
fonction activée (voirtune2fs(8)
pour plus de détails sur la vérification et le tournage de la fonction), alors vous pouvez raisonnablement magasin de plus de 100 000 fichiers dans un répertoire avant les performances se dégradent. (dir_index
a été la valeur par défaut pour les nouveaux systèmes de fichiers pour la plupart des distributions depuis plusieurs années maintenant, de sorte qu'il ne serait un vieux système de fichiers qui n'ont pas la fonctionnalité par défaut.)Cela dit, en ajoutant un autre niveau de répertoire afin de réduire le nombre de fichiers dans un répertoire par un facteur de 16 ou 256 considérablement améliorer les chances des choses comme
ls *
de travail, sans tourner le noyau maximumargv
taille.Généralement, cela se fait par quelque chose comme:
c'est à dire, ajoutant une lettre ou un chiffre pour le chemin d'accès, basée sur une fonction, vous pouvez calculer hors tension le nom. (Les deux premiers caractères de
md5sum
ousha1sum
du nom de fichier est une approche commune, mais si vous avez unique id d'objet, puis'a'+ id % 16
est assez facile mécanisme pour déterminer le répertoire à utiliser.)60000 n'est rien, 20000 ainsi. Mais il faut mettre du groupe de ces 20000 par tous les moyens afin d'accélérer l'accès à eux. Peut-être dans des groupes de 100 ou 1000, en prenant le numéro de l'annuaire et de le diviser par 100, 500, 1000, que ce soit.
E. g., J'ai un projet dans lequel les fichiers ont des numéros. J'groupe dans 1000s, j'ai donc
Vous fait peut avoir une dure limite sur certains systèmes 32 bits inodes, de sorte que vous êtes limité à un nombre de 2^32 par système de fichiers.
En plus des réponses générales (en gros "ne vous embêtez pas beaucoup", et "régler votre système de fichiers", et "d'organiser votre répertoire avec des sous-répertoires contenant quelques milliers de fichiers"):
Si les images sont de petite taille (par exemple moins de quelques kilo-octets), au lieu de les mettre dans un dossier, vous pouvez aussi les mettre dans une base de données (par exemple avec MySQL comme un BLOB) ou peut-être à l'intérieur d'un GDBM de fichiers indexés. Ensuite, chaque petit élément à ne pas consommer un inode (sur beaucoup de systèmes de fichiers, chaque inode veut au moins quelques kilo-octets). Vous pouvez aussi le faire pour un certain seuil (par exemple, mettre des images plus grandes que 4kbytes dans des fichiers individuels, et de plus petits dans une base de données GDBM fichier). Bien sûr, n'oubliez pas de sauvegarder vos données (et de définir une stratégie de sauvegarde).
sendfile(2)
pour le transfert de fichiers sans logiciel de serveur d'intervention.L'année 2014. Je reviens dans le temps d'ajouter à cette réponse.
Beaucoup de grands et de petits fichiers? Vous pouvez utiliser Amazon S3 et d'autres solutions basées sur des Ceph comme DreamObjects, où il n'existe pas de répertoire des limites à s'inquiéter.
J'espère que cela aide quelqu'un à décider de toutes les solutions de rechange.