Сколько файлов в каталоге слишком много? (Загрузка данных из сети)

19

Привет,

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

Каталог доступен через Интернет. Конечный пользователь обращается к веб-службе, которая возвращает путь к файлу, который понадобится пользователю.

Мне было интересно, на каком этапе я вижу влияние на производительность, если все эти файлы находятся в одном каталоге? (Если есть)

Стив
источник
Некоторые цифры для MacOS здесь
smci
относящиеся: superuser.com/q/453348/453247
Стивен Р.

Ответы:

12

Производительность зависит от используемой вами файловой системы.

  • FAT: забудьте об этом :) (хорошо, я думаю, что ограничение составляет 512 файлов на каталог)
  • NTFS: Хотя он может хранить до 4 миллиардов файлов в папке, он сравнительно быстро деградирует - около тысячи вы начнете замечать проблемы с производительностью, несколько тысяч, и вы увидите, что обозреватель зависает довольно долго.
  • EXT3: физический лимит составляет 32 000 файлов, но перфорация страдает после нескольких тысяч файлов.

  • EXT4: теоретически безгранично

  • ReiserFS, XFS, JFS, BTRFS: они подходят для большого количества файлов в каталоге, поскольку они более современны и предназначены для обработки многих файлов (другие были разработаны в те времена, когда жесткие диски измерялись в МБ, а не в ГБ) , Производительность намного выше для большого количества файлов (наряду с ext4), поскольку они оба используют алгоритм двоичного типа поиска для получения нужного файла (другие используют более линейный).

gbjbaanb
источник
6
Это не правильно. В EXT3 нет ограничения в 32000 файлов. Существует ограничение в 32000 подкаталогов. У меня есть каталог с более чем 300000 файлов, и он работает нормально.
Дэвидшельдон
1
Совершенно верно - ограничение файла - это ограничение всей файловой системы на inode, но вы ограничены 32k ссылками (то есть подкаталогами).
gbjbaanb
Утверждение для текущей NTFS также неверно, оно может содержать до 4 294 967 295 (2 ^ 32 - 1): technet.microsoft.com/en-us/library/cc781134%28WS.10%29.aspx
Fleshgrinder
НЕ путайте подкаталоги с файлами, на CentOS-машине у меня было 32000 подкаталогов, достигнут предел, я переместил все ФАЙЛЫ в этот каталог и все еще работает нормально.
adrianTNT
Некоторые цифры для MacOS здесь
smci
8

Я храню изображения для обслуживания веб-сервером, и у меня более 300 000 изображений в одном каталоге на EXT3. Я не вижу проблем с производительностью. Перед настройкой я провел тесты с изображениями 500 КБ в каталоге и произвольным доступом к файлам по имени, и не было значительного замедления с изображениями 500 КБ более 10 КБ в каталоге.

Единственный недостаток, который я вижу, заключается в том, что для синхронизации новых со вторым сервером мне нужно запустить rsyncвесь каталог, а не просто сказать ему синхронизировать подкаталог, содержащий самую последнюю тысячу или около того.

davidsheldon
источник
Что ж, для synic со вторым сервером я думаю, что вы должны создать структуру и алгоритм, который хранит изменения, тогда этот журнал может сэкономить вам много времени.
Бахадир Тасдемир
+1 Это на самом деле отвечает на вопрос.
kubanczyk
Один недостаток: если вы используете FTP-клиент, такой как FileZilla, и хотите просмотреть содержимое папки, это займет некоторое время.
Кай Ноак
3

Количество файлов в папке теоретически может быть неограниченным. Однако каждый раз, когда ОС будет обращаться к определенной папке для поиска файлов, ей придется обрабатывать все файлы в папке. При наличии менее 500 файлов вы можете не заметить никаких задержек. Но если в одной папке находятся десятки тысяч файлов, простая команда списка папок (ls или dir) может занять слишком много времени. Когда к этим папкам можно получить доступ через FTP, это действительно будет слишком медленно ...

Проблемы с производительностью будут зависеть не от вашей ОС, а от скорости процессора, емкости диска и памяти. Если у вас есть такое количество файлов, вы можете объединить их в один архив и использовать систему архивации, которая оптимизирована для хранения большого количества данных. Это может быть ZIP-файл, но, что еще лучше, храните их в виде больших двоичных объектов в базе данных с именем файла в качестве первичного ключа.

Вим тен Бринк
источник
Но будет ли доступ к файлу напрямую устранять узкие места при поиске в каталогах, или доступ к директиве все еще будет иметь основной поисковый вызов? (Linux, Debian)
Стив
3
Прямой доступ к файлу уменьшит эти проблемы. Я провел тесты на ext3, и доступ к файлу по имени в каталоге, содержащем 500000 файлов, не намного медленнее, чем в каталоге, содержащем 1000. Очевидно, что создание lsпроблемы является проблемой.
Дэвидшельдон
Зная точное имя, доступ должен быть быстрым. Проблема будет в основном любой код или команда, которая хочет получить список файлов.
Вим тен Бринк
1

Мое эмпирическое правило заключается в разделении папок, если существует более 1000 файлов, и папка будет просматриваться (т.е. через Интернет или Проводник) или 5000 файлов в противном случае.

Beep Beep
источник
0

Как указывает @skaffman, ограничения зависят от операционной системы. На вас, вероятно, будут влиять ограничения на старые ОС. Я помню, что старая версия Solaris была ограничена 32768 файлами на каталог.

Обычным решением является использование некоторого типа хеширования, то есть сервер Cyrus imap разделяет пользователей по буквенному хешу:

/var/spool/imap/a/user/anna/
/var/spool/imap/a/user/albert/
/var/spool/imap/d/user/dan/
/var/spool/imap/e/user/ewan/
diciu
источник
1
Спасибо, я определенно что-то сделаю, когда в директории будет больше 2к файлов! :)
Стив
Этот вопрос имеет некоторые хорошие ответы: serverfault.com/questions/95444/...
Дэви
Мое общее правило заключается в том, что более 20000 файлов в каталоге не очень хорошая идея. Большинство современных файловых систем работают с таким количеством файлов. После того, как вы нажмете 32k файлов в каталоге, некоторые файловые системы, такие как ext3, начнут иметь серьезные проблемы с производительностью.
Фил Холленбек
Фил - есть ли у вас какая-либо информация о проблемах с производительностью более 32 тыс. Файлов с ext3, в настоящее время я не вижу никакой информации о более чем 300 тыс. Файлов Возможно, это не влияет на мой способ использования.
Дэвидшельдон
На моей предыдущей работе научное программное обеспечение генерировало множество небольших (по несколько k каждый) файлов в каталоге. Мы определенно видели, что для> 32 КБ файлов время чтения каталогов сильно возрастет. Простой запуск «ls» в каталоге с таким количеством файлов займет минуту или больше.
Фил Холленбек
0

Если у вас есть прямой доступ к файлу, количество файлов в каталоге не является проблемой скорости.

Количество файлов, которые вы можете создать в одном каталоге, зависит от используемой вами файловой системы. Если вы перечисляете все файлы в каталоге или выполняете поиск, сортировку и т. Д., Имея много файлов, это замедлит эти операции.

gbjbaanb ошибся в своем ответе о максимальном размере файла ext3. Обычно ext ограничивает количество файлов на вашем диске в целом. Вы не можете создать больше файлов, чем у вас есть inode в вашей таблице inode. Он прав, предлагая reiserfs для большей производительности со многими файлами

Януш
источник
0

Проверенная папка с 10K файлами в NTFS (Windows 7, 64 bit). Папка с изображениями 10K в любом представлении (Список, Значок и т. Д.) Работает и прокручивается без заметной задержки.

Виль
источник