У меня в MacOS X более 100 000 файлов в каталоге, и, похоже, мой скрипт медленно читает в них файл.
Есть ли ограничение или рекомендация иметь столько файлов? Должен ли я разделить их на несколько каталогов?
Ограничение, которое я нашел, было то, что я не могу mv * foo
для всех 100 000 файлов. Это показывает ошибку, говоря «слишком длинный аргумент». Он работает с примерно менее 20000 файлов.
macos
mac
filesystems
Daisuki Honey
источник
источник
*
или?
как часть аргумента команды, операционная система ищет во всем каталоге соответствующие файлы (медленно), а затем заменяет ваш аргумент списком каждого соответствующего файла (долго), который затем передает команда. Вы могли бы сделать лучше с петлей или с несколькими командами мв, например,mv a* foo && mv b* foo
.Ответы:
Согласно этому ответу о переполнении стека и конкретным сведениям на сайте Apple , в отдельной папке может содержаться до 2,1 миллиарда элементов.
Тем не менее, тот факт, что он может содержать до 2,1 миллиарда элементов, не означает, что он может поддерживать производительность на этом уровне. Согласно Википедии ; Акцент мой
Таким образом, производительность естественным образом снижается благодаря тому, что файл каталога может использоваться только одной программой за раз. И если каталог увеличивается в размере, риск / ухудшение, вызванное этой проблемой, будет только возрастать; Чем больше файлов, тем больше у программ шансов получить доступ к файлам в этом одном каталоге. Дальнейшее подтверждение этой идеи здесь ; опять акцент мой
источник
Короткий ответ: Хорошо, если вы читаете 100 000 файлов, я могу ожидать, что скрипт будет медленным.
Длинный ответ: Чтобы ответить на этот вопрос более подробно, вам нужно взглянуть на файловую систему на Mac. Mac используют HFS + ( Hierarchical File System Plus ), которая является современной файловой системой, которая имеет ограничения, но только в экстремальных ситуациях.
По моему опыту, это очень похоже на файловую систему журналирования Linux EXT. Он поддерживает монтирование каталогов, UNIX-подобные разрешения и т. Д. Он обращался к файлам в 32-разрядном формате, в соответствии с этим максимальное количество файлов может быть сохранено в томе 4 294 967 295, согласно этому источнику.
Файловая система начинает ломаться с файлами размером более 8 EB в современных системах и до 2,1 миллиарда файлов и папок в одном месте, как показано здесь .
Учитывая способ, которым HFS + - или действительно любая файловая система настроена в этом отношении - наличие большого количества файлов в папке не должно делать ничего «странного».
Честно говоря, я не думаю, что было бы улучшение производительности при распределении файлов по более сложной иерархии папок. На самом деле, этот метод может быть менее эффективным, потому что ваш сценарий должен будет делать вызовы, чтобы изменить каталоги в середине процесса.
источник