Сколько файлов я могу поместить в каталог? - PullRequest
529 голосов
/ 21 января 2009

Имеет ли значение, сколько файлов я храню в одном каталоге? Если да, сколько файлов в каталоге слишком много, и каково влияние наличия слишком большого количества файлов? (Это на сервере Linux.)

Фон: у меня есть веб-сайт фотоальбома, и каждое загруженное изображение переименовывается в 8-шестнадцатеричный идентификатор (скажем, a58f375c.jpg). Это делается для того, чтобы избежать конфликтов имен файлов (например, если загружено много файлов «IMG0001.JPG»). Исходное имя файла и любые полезные метаданные хранятся в базе данных. Сейчас у меня где-то около 1500 файлов в каталоге изображений. Это приводит к тому, что перечисление файлов в каталоге (через FTP или SSH-клиент) занимает несколько секунд. Но я не вижу, что это имеет какое-либо влияние, кроме этого. В частности, похоже, что скорость передачи файла изображения пользователю не влияет.

Я думал об уменьшении количества изображений, создав 16 подкаталогов: 0-9 и a-f. Затем я переместил бы изображения в подкаталоги, основываясь на том, какой была первая шестнадцатеричная цифра имени файла. Но я не уверен, что для этого есть какая-либо причина, кроме случайного перечисления каталога через FTP / SSH.

Ответы [ 21 ]

688 голосов
/ 21 января 2009

FAT32

  • Максимальное количество файлов: 268 173 300
  • Максимальное количество файлов в каталоге: 2 16 - 1 (65 535)
  • Максимальный размер файла: 2 ГиБ - 1 без LFS , 4 ГиБ - 1 с

NTFS

  • Максимальное количество файлов: 2 32 - 1 (4 294 967 295)
  • Максимальный размер файла
    • Реализация: 2 44 - 2 6 байтов (16 ТиБ - 64 КиБ)
    • Теоретический: 2 64 - 2 6 байт (16 EiB - 64 КиБ)
  • Максимальный размер тома
    • Реализация: 2 32 - 1 кластер (256 ТиБ - 64 КиБ)
    • Теоретический: 2 64 - 1 кластер (1 Yi - 64 КиБ)

ext2

  • Максимальное количество файлов: 10 18
  • Максимальное количество файлов в каталоге: ~ 1,3 & раз; 10 20 (проблемы производительности после 10 000)
  • Максимальный размер файла
    • 16 ГиБ (размер блока 1 КиБ)
    • 256 ГиБ (размер блока 2 КиБ)
    • 2 ТиБ (размер блока 4 КиБ)
    • 2 ТиБ (размер блока 8 КиБ)
  • Максимальный размер тома
    • 4 ТиБ (размер блока 1 КиБ)
    • 8 ТиБ (размер блока 2 КиБ)
    • 16 ТиБ (размер блока 4 КиБ)
    • 32 ТиБ (размер блока 8 КиБ)

ext3

  • Максимальное количество файлов: мин. (VolumeSize / 2 13 , numberOfBlocks)
  • Максимальный размер файла: такой же, как у ext2
  • Максимальный размер тома: такой же, как у ext2

ext4

  • Максимальное количество файлов: 2 32 - 1 (4 294 967 295)
  • Максимальное количество файлов в каталоге: не ограничено
  • Максимальный размер файла: 2 44 - 1 байт (16 ТиБ - 1)
  • Максимальный размер тома: 2 48 - 1 байт (256 ТиБ - 1)
176 голосов
/ 12 августа 2011

У меня было более 8 миллионов файлов в одном каталоге ext3. libc readdir(), который используется find, ls и большинством других методов, обсуждаемых в этом потоке, для вывода больших каталогов.

Причина, по которой ls и find являются медленными в этом случае, заключается в том, что readdir() считывает только 32 КБ записей каталога за раз, поэтому на медленных дисках для получения списка каталога потребуется много операций чтения. Существует решение этой проблемы со скоростью. Я написал довольно подробную статью об этом по адресу: http://www.olark.com/spw/2011/08/you-can-list-a-directory-with-8-million-files-but-not-with-ls/

Ключ к выводу: используйте getdents() напрямую - http://www.kernel.org/doc/man-pages/online/pages/man2/getdents.2.html, а не все, что основано на libc readdir(), так что вы можете указать размер буфера при чтении записей каталога с диска.

56 голосов
/ 07 июля 2012

У меня есть каталог с 88 914 файлами в нем. Как и вы, это используется для хранения миниатюр и на сервере Linux.

Перечисленные файлы через FTP или php работают медленно, да, но при отображении файла также наблюдается снижение производительности. например www.website.com/thumbdir/gh3hg4h2b4h234b3h2.jpg имеет время ожидания 200-400 мс. Для сравнения на другом сайте у меня есть около 100 файлов в каталоге, изображение отображается после всего лишь ~ 40 мс ожидания.

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

56 голосов
/ 21 января 2009

Это немного зависит от конкретной файловой системы, используемой на сервере Linux. В настоящее время по умолчанию используется ext3 с dir_index, что делает поиск больших каталогов очень быстрым.

Так что скорость не должна быть проблемой, кроме той, которую вы уже отметили, а именно то, что списки займут больше времени.

Существует ограничение на общее количество файлов в одном каталоге. Кажется, я помню, что он определенно работал до 32000 файлов.

47 голосов
/ 21 января 2009

Имейте в виду, что в Linux, если у вас есть каталог со слишком большим количеством файлов, оболочка может не иметь возможности использовать подстановочные знаки. У меня есть эта проблема с фотоальбомом, размещенным на Linux. Он хранит все изображения с измененным размером в одном каталоге. Хотя файловая система может обрабатывать много файлов, оболочка не может. Пример:

-shell-3.00$ ls A*
-shell: /bin/ls: Argument list too long

или

-shell-3.00$ chmod 644 *jpg
-shell: /bin/chmod: Argument list too long
22 голосов
/ 21 января 2009

Я сейчас работаю над похожей проблемой. У нас есть иерархическая структура каталогов и мы используем идентификаторы изображений в качестве имен файлов. Например, изображение с id=1234567 помещается в

..../45/67/1234567_<...>.jpg

, используя последние 4 цифры, чтобы определить, куда идет файл.

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

16 голосов
/ 10 ноября 2013

Для этого я просто создал каталог в файловой системе ext4 с 1 000 000 файлов в нем, а затем произвольно получил доступ к этим файлам через веб-сервер. Я не заметил никаких премий за доступ к тем, у кого, скажем, только 10 файлов там.

Это радикально отличается от моего опыта, который я делал на ntfs несколько лет назад.

12 голосов
/ 21 января 2009

Самая большая проблема, с которой я столкнулся, связана с 32-битной системой. Как только вы передадите определенное число, такие инструменты, как 'ls', перестанут работать.

Попытка что-либо сделать с этим каталогом, когда вы преодолеете этот барьер, становится огромной проблемой.

6 голосов
/ 21 января 2009

Это абсолютно зависит от файловой системы. Многие современные файловые системы используют приличные структуры данных для хранения содержимого каталогов, но старые файловые системы часто просто добавляли записи в список, поэтому извлечение файла было операцией O (n).

Даже если файловая система все делает правильно, программы, перечисляющие содержимое каталога, все же могут ошибиться и выполнить сортировку O (n ^ 2), поэтому, чтобы быть в безопасности, я бы всегда ограничивал число количество файлов в каталоге не более 500.

6 голосов
/ 21 января 2009

Это действительно зависит от используемой файловой системы, а также от некоторых флагов.

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

Лично я использую подкаталоги, чтобы большинство уровней не превышало тысячи предметов. В вашем случае я бы создал 256 каталогов с двумя последними шестнадцатеричными цифрами идентификатора. Используйте последние, а не первые цифры, чтобы сбалансировать нагрузку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...