Много файлов в одном каталоге? - PullRequest
7 голосов
/ 21 февраля 2010

Я занимаюсь разработкой PHP-проекта на платформе Linux. Есть ли недостатки в размещении нескольких тысяч изображений (файлов) в одном каталоге? Это закрытый набор, который не будет расти. Альтернативой может быть разделение этих файлов с использованием структуры каталогов на основе некоторого идентификатора (таким образом, в одном каталоге будет, скажем, только 100).

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

Что бы я получил, если бы не помещал несколько тысяч файлов (не растущего набора) в один каталог, а разделял их на группы, например 100? Стоит ли все усложнять?

UPDATE:

  • Не будет никакой программной итерации по файлам в каталоге (только прямой доступ к изображению по имени файла)
  • Хочу подчеркнуть, что набор изображений закрыт. Это менее 5000 изображений, и это все.
  • Нет логической классификации этих изображений
  • Доступ человека / просмотр не требуется
  • Изображения имеют уникальные имена файлов
  • ОС: Debian / Linux 2.6.26-2-686, файловая система: ext3

ЦЕННАЯ ИНФОРМАЦИЯ ОТ ОТВЕТОВ:

Зачем разделять много файлов на разные каталоги:

  • «Ограничение 32 тыс. Файлов на каталог при использовании ext3 поверх nfs»
  • причина производительности (скорость доступа) [но для нескольких тысяч файлов трудно сказать, стоит ли это, без измерения]

Ответы [ 7 ]

7 голосов
/ 21 февраля 2010

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

Простой подход - md5() имя файла, затем использовать первые n символов в качестве имени каталога (например, substr(md5($filename), 2)). Это обеспечивает достаточно равномерное распределение (по сравнению с первым n символами прямого имени файла).

2 голосов
/ 21 февраля 2010

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

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

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

1 голос
/ 21 февраля 2010

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

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

1 голос
/ 21 февраля 2010

Я думаю, что у этого вопроса есть два аспекта:

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

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

0 голосов
/ 21 февраля 2010

Если вы хотите изменить файловую систему, я бы порекомендовал переносить все изображения в файловую систему ReiserFS.Он отлично справляется с быстрым хранением / доступом к множеству небольших файлов.

Если нет, то ответ MightyE на разбиение их на папки является наиболее логичным и значительно увеличит время доступа.

0 голосов
/ 21 февраля 2010

Несколько тысяч изображений все еще в порядке. При доступе к каталогу операционные системы считывают список его файлов по блокам 4K. Если у вас простая структура каталогов, может потребоваться время, чтобы прочитать весь список файлов, если в нем много (например, сто тысяч) файлов.

0 голосов
/ 21 февраля 2010

Единственная причина, по которой я мог себе представить, где это пагубно, - это перебор каталога Больше файлов, значит больше итераций. Но это в основном все, о чем я могу думать с точки зрения программирования.

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