Placer de nombreux (10 millions) fichiers dans un dossier

17

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

Y aurait-il un problème avec moi à enregistrer les résultats potentiels de 10 millions de cira dans des fichiers séparés dans un répertoire? Ou est-il conseillé de les diviser en dossiers?

Exemple:

Kohjah Breese
la source
5
Il vaudrait mieux se séparer. Toute commande qui essaie de lister le contenu de ce répertoire décidera probablement de se tirer dessus.
muru
8
Donc, si vous avez déjà une base de données, pourquoi ne pas l'utiliser? Je suis sûr que le SGBD sera mieux en mesure de gérer des millions d'enregistrements par rapport au système de fichiers. Si vous êtes déterminé à utiliser le système de fichiers, vous devez trouver un schéma de fractionnement utilisant une sorte de hachage, à ce stade, à mon humble avis, il semble que l'utilisation de la base de données sera moins de travail.
roadmr
3
Une autre option de mise en cache qui conviendrait mieux à votre modèle pourrait être memcached ou redis. Ce sont des magasins de valeurs clés (ils agissent donc comme un répertoire unique et vous accédez aux éléments uniquement par leur nom). Redis est persistant (ne perdra pas de données lors de son redémarrage) alors que memcached l'est pour des éléments plus temporaires.
Stephen Ostermiller
2
Il y a un problème de poulet et d'oeuf ici. Les développeurs d'outils ne gèrent pas les répertoires contenant un grand nombre de fichiers car les gens ne le font pas. Et les gens ne créent pas de répertoires avec un grand nombre de fichiers car les outils ne le prennent pas bien en charge. Par exemple, je comprends à un moment donné (et je pense que cela est toujours vrai), une demande de fonctionnalité pour faire une version de générateur os.listdiren python a été catégoriquement refusée pour cette raison.
D'après ma propre expérience, j'ai vu des ruptures lors du passage de plus de 32 000 fichiers dans un seul répertoire sous Linux 2.6. Il est possible d'accorder au-delà de ce point, bien sûr, mais je ne le recommanderais pas. Il suffit de diviser en quelques couches de sous-répertoires et ce sera beaucoup mieux. Personnellement, je le limiterais à environ 10 000 par répertoire, ce qui vous donnerait 2 couches.
Wolph

Réponses:

25

Y aurait-il un problème avec moi à enregistrer les 10 millions de résultats potentiels dans des fichiers séparés dans un répertoire?

Oui. Il y a probablement plus de raisons, mais je peux les afficher du haut de ma tête:

  • tune2fsa une option appelée dir_indexqui a tendance à être activée par défaut (sur Ubuntu, c'est le cas) qui vous permet de stocker environ 100 000 fichiers dans un répertoire avant de voir un impact sur les performances. Ce n'est même pas proche des fichiers de 10 millions auxquels vous pensez.

  • extles systèmes de fichiers ont un nombre maximal fixe d'inodes. Chaque fichier et répertoire utilise 1 inode. Utilisez df -ipour une vue de vos partitions et inodes gratuitement. Lorsque vous manquez d'inodes, vous ne pouvez pas créer de nouveaux fichiers ou dossiers.

  • les commandes comme rmet lslorsque vous utilisez des caractères génériques développent la commande et se retrouveront avec une "liste d'arguments trop longue". Vous devrez utiliser findpour supprimer ou répertorier les fichiers. Et a findtendance à être lent.

Ou est-il conseillé de les diviser en dossiers?

Oui. Très certainement. Fondamentalement, vous ne pouvez même pas stocker des fichiers de 10 m dans 1 répertoire.

J'utiliserais la base de données. Si vous souhaitez le mettre en cache pour un site Web, jetez un œil à " solr " ("fournissant une indexation distribuée, une réplication et des requêtes à charge équilibrée").

Rinzwind
la source
8

A fini avec le même problème. Exécutez mes propres tests de performances pour savoir si vous pouvez tout placer dans le même dossier par rapport à plusieurs dossiers. Il semble que vous le puissiez et c'est plus rapide!

Référence

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

Hartator
la source
1
Merci, c'est très utile. J'utilise ceci sur un site et cela a été un vrai problème de reprogrammer cette partie pour avoir des structures de répertoires /abc/efg.html. Je vais donc revenir à un répertoire plat à l'avenir.
Kohjah Breese
0

Une recherche binaire peut facilement gérer des millions d'enregistrements, donc la recherche dans le répertoire unique ne serait pas un problème. Il le fera très rapidement.

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

Berekely DB, un logiciel open source, vous permettrait facilement de stocker le résultat complet sous une seule entrée et aurait la recherche intégrée.

Ashok Chand Mathur
la source