8

У меня есть 100 000+ файлов в каталоге в моей MacOS X и, похоже, мой скрипт медленно читает файл в них.

Есть ли ограничение или рекомендация иметь столько файлов? Должен ли я разделить их на несколько каталогов?

Я обнаружил ограничение: я не могу использовать mv * foo для всех 100 000 файлов. Это показывает ошибку, говоря «слишком длинный аргумент». Он работает с примерно менее 20000 файлов.

2 ответа2

4

Короткий ответ: Хорошо, если вы читаете 100 000 файлов, я могу ожидать, что скрипт будет медленным.

Длинный ответ: Чтобы ответить на этот вопрос более подробно, вам нужно взглянуть на файловую систему на Mac. Mac используют HFS+ (Hierarchical File System Plus), которая является современной файловой системой, которая имеет ограничения, но только в экстремальных ситуациях.

По моему опыту, это очень похоже на файловую систему журналирования Linux EXT. Он поддерживает монтирование каталогов, UNIX-подобные разрешения и т.д. Он обращался к файлам в 32-битном формате, в соответствии с этим максимальное количество файлов может быть сохранено в томе 4 294 967 295, согласно этому источнику.

Файловая система начинает ломаться с файлами размером более 8 EB в современных системах и до 2,1 миллиарда файлов и папок в одном месте, как показано здесь.

Учитывая способ, которым HFS+- или действительно любая файловая система настроена в этом отношении - наличие большого количества файлов в папке не должно делать ничего «странного».

Честно говоря, я не думаю, что было бы улучшение производительности при распределении файлов по более сложной иерархии папок. На самом деле, этот метод может быть менее эффективным, потому что ваш сценарий должен будет делать вызовы, чтобы изменить каталоги в середине процесса.

1

Согласно этому ответу о переполнении стека и конкретным сведениям на сайте Apple, отдельная папка может содержать до 2,1 миллиарда элементов.

Тем не менее, тот факт, что он может содержать до 2,1 миллиарда элементов, не означает, что он может поддерживать производительность на этом уровне. Согласно Википедии ; Акцент мой:

Файл каталога, в котором все записи файлов и каталогов хранятся в одной структуре данных, приводит к проблемам с производительностью, когда система допускает многозадачность, так как только одна программа может записывать в эту структуру одновременно, а это означает, что многие программы могут ожидать в очереди из-за одной программы "зависания" системы.Это также серьезная проблема с надежностью, поскольку повреждение этого файла может уничтожить всю файловую систему.

Таким образом, производительность естественным образом снижается благодаря тому факту, что файл каталога может использоваться только одной программой за раз. И если каталог увеличивается в размере, риск / ухудшение, вызванное этой проблемой, только возрастет; Чем больше файлов, тем больше у программ шансов получить доступ к файлам в этом каталоге. Дальнейшее подтверждение этой идеи здесь ; опять акцент мой

Файл каталога представляет собой сложную структуру. Поскольку он хранит всю информацию о файлах и каталогах, он вызывает сериализацию файловой системы - не идеальная ситуация, когда существует большое количество потоков, желающих выполнить файловый ввод-вывод. В HFS любая операция, которая создает файл или изменяет файл любым способом, должна блокировать файл каталога, что препятствует доступу других потоков даже к файлу каталога, доступному только для чтения.Доступ к файлу каталога должен быть однопользовательским / многопоточным.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .