Une limitation pour avoir plusieurs fichiers dans un répertoire sous Mac OS X?

9

J'ai plus de 100 000 fichiers dans un répertoire de mon MacOS X et il semble lent que mon script y lise un fichier.

Y a-t-il une limitation ou une recommandation pour avoir autant de fichiers? Dois-je les diviser en certains répertoires?

La limitation que j'ai trouvée est que je ne peux pas mv * foopour les 100 000 fichiers. Il affiche une erreur indiquant "argument trop long". Il fonctionne avec environ moins de 20 000 fichiers.

Miel de Daisuki
la source
Actuellement, j'ai 380 000 fichiers dans un répertoire et je me rends compte que même l'ouverture d'un fichier prend simplement plus de 10 secondes. J'ai décidé de les séparer dans certains répertoires.
Daisuki Honey
1
Le système de fichiers HFS + devrait pouvoir stocker et accéder à un grand nombre de fichiers dans un répertoire par leur nom complet sans trop de problèmes. Mais vous devez faire attention aux caractères génériques. Lorsque vous utilisez *ou ?dans le cadre d'un argument d'une commande, le système d'exploitation recherche dans le répertoire entier les fichiers correspondants (lent), puis il remplace votre argument par une liste de chaque fichier correspondant (long), qu'il transmet ensuite à la commander. Vous pourriez faire mieux avec une boucle ou avec plusieurs commandes mv, par exemple mv a* foo && mv b* foo.
Matthias Fripp

Réponses:

1

Selon cette réponse Stack Overflow et des détails spécifiques sur le site d'Apple , un dossier individuel peut contenir jusqu'à 2,1 milliards d'éléments.

Cela dit, ce n'est pas parce qu'il peut contenir jusqu'à 2,1 milliards d'articles qu'il peut maintenir les performances à ce niveau. Selon Wikipedia ; l'accent est sur moi:

Le fichier catalogue, qui stocke tous les enregistrements de fichiers et de répertoires dans une seule structure de données, entraîne des problèmes de performances lorsque le système autorise le multitâche, car un seul programme peut écrire dans cette structure à la fois, ce qui signifie que de nombreux programmes peuvent être en attente dans la file d'attente. en raison d'un programme "monopolisant" le système. Il s'agit également d'un sérieux problème de fiabilité, car des dommages à ce fichier peuvent détruire l'intégralité du système de fichiers.

Les performances sont donc naturellement dégradées grâce au fait que le fichier catalogue ne peut être utilisé que par un programme à la fois. Et si le répertoire augmente en taille, le risque / dégradation causé par ce problème ne fera qu'augmenter; plus de fichiers signifie plus de chance pour les programmes d'accéder aux fichiers de ce répertoire. Confirmation supplémentaire de cette idée ici ; encore une fois, l'accent est sur moi:

Le fichier catalogue est une structure compliquée. Parce qu'il conserve toutes les informations sur les fichiers et les répertoires, il force la sérialisation du système de fichiers, ce qui n'est pas une situation idéale lorsqu'un grand nombre de threads souhaitent effectuer des E / S sur les fichiers. Dans HFS, toute opération qui crée un fichier ou modifie un fichier de quelque manière que ce soit doit verrouiller le fichier de catalogue, ce qui empêche les autres threads d'accéder même en lecture seule au fichier de catalogue. L'accès au fichier catalogue doit être à rédacteur unique / multireader.

JakeGould
la source
Merci beaucoup. Je comprends que l'accès au fichier de catalogue sera le goulot d'étranglement et qu'il peut entraîner de sérieux problèmes de performances, en particulier pour le multitâche.
Daisuki Honey
@DaisukiHoney Vous êtes les bienvenus! Donc, si vous avez trouvé ma réponse utile, n'oubliez pas de la voter. Et si c'est la réponse qui a résolu votre problème, n'oubliez pas de la cocher en tant que telle.
JakeGould
Oui, je vote votre réponse et cochez-la. Encore merci.
Daisuki Honey
Les sections Wikipédia que vous citez parlent des limites d'évolutivité par système de fichiers, pas par répertoire: il n'y a qu'un seul fichier catalogue par système de fichiers et tous les accès doivent être sérialisés. Cela n'a aucun rapport avec la question.
poolie du
@poolie La question porte sur chaque répertoire qui existe sur un système de fichiers. Le fichier catalogue existe par système de fichiers mais le répertoire lui-même existe également sur le même système de fichiers. Il est pertinent pour une question portant sur plus de 10 000 fichiers dans un répertoire qui existe sur un système de fichiers unique. Mais cette question a plus de 2 ans, alors merci pour le lien Wiki. J'ai mis à jour ma réponse pour y inclure la nouvelle formulation ainsi qu'un lien direct vers la section en question.
JakeGould du
4

Réponse courte: Eh bien, si vous lisez 100 000 fichiers, je pourrais m'attendre à ce que le script soit lent.

Réponse longue: Pour répondre à cette question de manière plus approfondie, vous devez examiner le système de fichiers sur un Mac. Les Mac utilisent le HFS + ( Hierarchical File System Plus ), qui est un système de fichiers moderne qui a ses limites, mais uniquement dans des situations extrêmes.

D'après mon expérience, cela ressemble beaucoup à un système de fichiers de journalisation Linux EXT. Il prend en charge les répertoires de montage, de type UNIX autorisations, etc. Il traite des fichiers dans un format 32 bits, ce qui rend le nombre maximum de fichiers qui peuvent être stockés dans un volume 4294967295, selon cette source de .

Le système de fichiers commence à rompre avec des fichiers supérieurs à 8 EB sur les systèmes modernes et jusqu'à 2,1 milliards de fichiers et dossiers en un seul endroit, comme indiqué ici .

Étant donné la façon dont le HFS + - ou vraiment n'importe quel système de fichiers est configuré d'ailleurs - avoir beaucoup de fichiers dans un dossier ne devrait rien faire de «bizarre».

Honnêtement, je ne pense pas qu'il y aurait une amélioration des performances en répartissant les fichiers sur une hiérarchie de dossiers plus complexe. En fait, cette technique pourrait être moins efficace car votre script devrait effectuer des appels pour changer de répertoire au milieu du processus.

James Taylor
la source
Droite. J'ai pensé à changer la hiérarchie des répertoires mais cela cause un algorithme plus compliqué et je soupçonne que beaucoup d'amélioration des performances. Merci d'avoir répondu. J'ai actuellement 200 000 fichiers dans le répertoire et peut-être 1 000 000 à la fin. J'espère que cela fonctionne bien sans cette mauvaise performance.
Daisuki Honey
@DaisukiHoney Si vous travaillez avec autant de fichiers, cela peut valoir la peine de voir si vous pouvez subdiviser les choses en répertoires. Cela pourrait être difficile à faire à ce stade, mais cela pourrait rendre les choses un peu plus stables à l'avenir.
JakeGould
@JakeGould Merci pour les conseils. J'ai pensé à restructurer car je pourrais ajouter quelques fichiers supplémentaires. Merci.
Daisuki Honey