Nombre de fichiers par répertoire

19

J'ai un répertoire avec environ 100000 petits fichiers (chaque fichier est de 1 à 3 lignes, chaque fichier est un fichier texte). En taille, le répertoire n'est pas très grand (<2 Go). Ces données résident dans un serveur NFS géré par des professionnels. Le serveur exécute Linux. Je pense que le système de fichiers est ext3, mais je ne sais pas avec certitude. De plus, je n'ai pas d'accès root au serveur.

Ces fichiers sont le résultat d'une expérience scientifique à grande échelle, sur laquelle je n'ai aucun contrôle. Cependant, je dois analyser les résultats.

Toute opération / traitement d'E / S dans ce répertoire est très, très lente. L'ouverture d'un fichier (fopen en python), la lecture d'un fichier ouvert, la fermeture d'un fichier, sont toutes très lentes. En bash ls, du, etc. ne fonctionnent pas.

La question est:

Quel est le nombre maximum de fichiers dans un répertoire sous Linux de telle sorte qu'il soit pratique de faire le traitement, l'ouverture, la lecture, etc.? Je comprends que la réponse dépend de beaucoup de choses: type de fs, version du noyau, version du serveur, matériel, etc. Je veux juste une règle d'or, si possible.

carlosdc
la source
6
Giles a bien répondu à votre question directe, mais dans l'ensemble, les systèmes de fichiers Linux sont de piètres substituts aux bases de données lorsque vous utilisez des noms de fichiers comme clés pour de minuscules bits de données. Vous ne contrôlez pas la génération, mais vous pouvez post-traiter les données sous une forme plus adaptée à l'analyse; si vous ne le faites pas, vous paierez les frais généraux du système de fichiers à chaque étape. Vous pouvez réduire les frais généraux, mais vous pourriez être plus heureux si vous les supprimez.
msw
Voir également ce stackoverflow.com/questions/466521/…
Cristi

Réponses:

22

Comme vous le supposez, cela dépend de beaucoup de choses, principalement le type et les options du système de fichiers et dans une certaine mesure la version du noyau. Dans la série ext2 / ext3 / ext4, il y avait une amélioration majeure lorsque l' dir_indexoption est apparue (quelque temps après la version initiale d'ext3): elle fait que les répertoires sont stockés sous forme d'arbres de recherche (accès temporel logarithmique) plutôt que de listes linéaires (accès temporel linéaire ). Ce n'est pas quelque chose que vous pouvez voir sur NFS, mais si vous avez des contacts avec les administrateurs, vous pouvez leur demander de s'exécuter tune2fs -l /dev/something |grep features(peut-être même les convaincre de mettre à niveau?). Seul le nombre de fichiers est important, pas leur taille.

Même avec dir_index, 100000 semble grand. Idéalement, demandez aux auteurs du programme qui crée les fichiers d'ajouter un niveau de sous-répertoires. Pour aucune dégradation des performances, je recommanderais une limite d'environ 1000 fichiers par répertoire pour ext2 ou ext3 sans dir_indexet 20000 avec dir_indexou reiserfs. Si vous ne pouvez pas contrôler la façon dont les fichiers sont créés, déplacez-les dans des répertoires distincts avant de faire quoi que ce soit d'autre.

Gilles 'SO- arrête d'être méchant'
la source