18 votes

Placer un grand nombre de fichiers (10 millions) dans un seul dossier

Je viens d'ajouter une fonction de recherche prédictive (voir l'exemple ci-dessous) à mon site qui fonctionne sur un serveur Ubuntu. Cette fonction fonctionne directement à partir d'une base de données. Je veux mettre en cache le résultat de chaque recherche et l'utiliser s'il existe, sinon le créer.

Y aurait-il un problème si je sauvegardais les 10 millions de résultats potentiels du Cira dans des fichiers séparés dans un même répertoire ? Ou est-il préférable de les répartir dans des dossiers ?

25voto

Rinzwind Points 270388

Y aurait-il un problème à ce que j'enregistre les quelque 10 millions de résultats potentiels dans des fichiers distincts dans un même répertoire ?

Oui. Il y a probablement d'autres raisons, mais je peux citer celles qui me viennent à l'esprit :

  • tune2fs dispose d'une option appelée dir_index qui tend à être activée par défaut (sur Ubuntu, c'est le cas) et qui vous permet de stocker environ 100 000 fichiers dans un répertoire avant que les performances n'en pâtissent. C'est loin des 10 millions de fichiers auxquels vous pensez.

  • ext Les systèmes de fichiers ont un nombre maximum fixe d'inodes. Chaque fichier et répertoire utilise 1 inode. Utiliser df -i pour obtenir une vue de vos partitions et des inodes libres. Lorsque vous n'avez plus d'inodes, vous ne pouvez plus créer de nouveaux fichiers ou dossiers.

  • des commandes telles que rm y ls lorsque vous utilisez des caractères génériques pour développer la commande et vous obtiendrez un message du type "liste d'arguments trop longue". Vous devrez utiliser find pour supprimer ou répertorier des fichiers. Et find a tendance à être lente.

Ou est-il préférable de les répartir dans des dossiers ?

Oui. Tout à fait. En principe, vous ne pouvez même pas stocker 10 millions de fichiers dans un seul répertoire.

J'utiliserais la base de données. Si vous voulez la mettre en cache pour un site web, jetez un coup d'œil à " solr "("fournissant une indexation distribuée, une réplication et une interrogation à charge équilibrée").

8voto

Hartator Points 181

Le même problème s'est posé. J'ai effectué mes propres tests pour savoir s'il était possible de tout placer dans le même dossier ou d'avoir plusieurs dossiers. Il semble que vous puissiez le faire et que ce soit plus rapide !

Benchmark

Réf : https://medium.com/@hartator/benchmark-deep-directory-structure-vs-flat-directory-structure-to-store-millions-of-files-on-ext4-cac1000ca28

0voto

Une recherche binaire peut facilement traiter des millions d'enregistrements, de sorte que la recherche dans un seul répertoire ne pose pas de problème. Elle le fera très rapidement.

En principe, si vous utilisez un système 32 bits, la recherche binaire jusqu'à 2 Go d'enregistrements est facile et efficace.

Berekely DB, un logiciel libre, vous permettrait de stocker le résultat complet sous une seule entrée et intégrerait la recherche.

0voto

jeffgao Points 11

Tout dépend de ce que vous voulez faire de ces 10 millions de fichiers. Si vous n'avez pas besoin d'effectuer une action de type "liste" ou "parcourir" sur le répertoire de stockage, mais que vous n'accédez qu'à des fichiers individuels par leur nom et que vous pouvez prédire leur nom sans ambiguïté, je ne vois aucun problème à stocker autant de fichiers dans le même répertoire.

D'un autre côté, gardez à l'esprit que la plupart des interfaces utilisateur et des shells ne sont pas conçus pour gérer efficacement cette situation. rm * mais plutôt ls | xargs rm pour supprimer tout ce qui se trouve ici.

Notez que le nombre d'inodes dans un système de fichiers de type Unix (par exemple ext4) n'est pas directement lié au choix d'une structure de répertoires plate ou hiérarchique, car quel que soit le répertoire dans lequel vous placez le fichier, il occupera des inodes. En fait, une structure de répertoires plus profonde a des frais généraux plus élevés en termes de consommation d'inodes. (Ainsi, la réponse acceptée mentionnait de manière trompeuse la limite d'inodes, ce qui n'étayait pas cet argument).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X