Как решить предел числа подкаталогов Linux?

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

9
задан 13 June 2012 в 10:31
10 ответов

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

top_level_dir
|---aa
|   |---aardvark1
|   |---aardvark2
|---da
|   |---dan
|   |---david
|---do
    |---don

Еще лучше должен был бы создать некоторую форму хеша имен и использования это для подразделения. Таким образом, Вы получите лучшее распространение среди каталогов вместо, с примером первых букв, "da" быть очень полным и "zz" абсолютно пустой. Например, если Вы будете брать CRC или MD5 имя и будете использовать первые 8 битов, то Вы получите что-то как:

top_level_dir
|---00
|   |---some_username
|   |---some_username
|---01
|   |---some_username
...
|---FF
|   |---some_username

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

top_level_dir
|---a
|   |---a
|       |---aardvark1
|       |---aardvark2
|---d
    |---a
    |   |---dan
    |   |---david
    |---o
        |---don

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

Одна важная вещь отметить состоит в том, что с ext2/3 Вы начнете поражать проблемы производительности перед нахождением рядом с этими 32 000 пределов так или иначе поскольку каталоги ищутся линейно. Перемещение в другую файловую систему (ext4 или сборщик, например) удалит эту неэффективность (каталоги поисков сборщика с разделенным на двоичный файл algorimth, такие длинные каталоги обрабатываются намного более эффективно, ext4 может сделать также), а также фиксированный предел на каталог.

16
ответ дан 2 December 2019 в 22:20
  • 1
    Просто обновленный описание вопроса для включения this:" Update:How о разделении базы пользователей в папки на основе диапазона идентификатора пользователя. Значение 1-1000 в одной папке, 1000-2000 в другом как этот. Это, кажется, просто. Что Вы говорите? " –  None-da 27 July 2009 в 12:33
  • 2
    Это работало бы хорошо и будет более эффективным, чем хеш, если пользователи обычно идентифицируются идентификатором пользователя вместо (или а также) имя пользователя. Хотя, если Вы всегда обращаетесь к ним по имени в другом месте в системе you' ll должны добавить дополнительный name-> идентификационные поиски повсеместно. –  David Spillett 27 July 2009 в 12:50
  • 3
    Слова благодарности David! Я попробовал даже другое решение. Я создал едва 4 папки с диапазоном 1-30000, 30000-60000 и т.д. Я думаю, получая файл из такого большого каталога, займет больше времени, чем из каталога, который имеет 1 000 файлов (предыдущий подход). Что Вы говорите? –  None-da 27 July 2009 в 19:53
  • 4
    Это зависит от файловой системы. Если бы Вы используете ext2 или ext3 затем, я рекомендовал бы намного меньший, чем 30 000 на каталог. Некоторые предупреждения о проблемах инструментов приблизительно 10 000. Можно включить индексацию каталога в ext3/4 для помощи: tune2fs-O dir_index/dev/< volumename> но просто сохранив количество объектов в каталоге ниже (несколько тысяч или меньше?) что I' d рекомендуют здесь. –  David Spillett 27 July 2009 в 20:08
  • 5
    @Maddy, Вы хотите это решение из-за других ограничений на то, как Ext2/3 обрабатывает большие количества файлов. См. serverfault.com/questions/43133/… для некоторой детали. Вспыхивая имена в блоки поскольку подкаталоги облегчают другие проблемы, с которыми Вы столкнулись бы в конечном счете. Обратите внимание, что это - та же стратегия, которую использует Сквид, когда это настраивает объектный кэш впервые - например, 64 каталога каждый с 64 каталогами в них, так же, как пример. –  Avery Payne 27 July 2009 в 23:56

Наклон у нас есть лучшее решение?

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

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

Просто радуйтесь, что Вы не застреваете с NTFS, который действительно плачевен для большого количества файлов в каталоге. Я рекомендовал бы JFS как замену, если Вы не представляете себе использовать относительно новое (но по-видимому стабильный) ext4 FS.

2
ответ дан 2 December 2019 в 22:20
  • 1
    У Вас есть хорошие ссылки на производительность файловой системы NTFS? –  Thorbjørn Ravn Andersen 27 July 2009 в 19:56
  • 2
    да, кроме личного опыта с приложением, которому оставили слишком длинные создающие новые файлы в каталоге.. (занял часы для удаления их всех), и повышение производительности подверсии путем ограничения количества файлов в каталоге к 1 000. Или читайте: support.microsoft.com/kb/130694 я don' t думают они когда-либо " fixed" это, поскольку это все еще отметило как тонкая настройка перфекта NTFS. –  gbjbaanb 27 July 2009 в 21:50

Если Вы связываетесь с ext2/ext3 единственная возможность, я вижу, должен разделить Ваши данные. Найдите критерий, который разделяет Ваши данные на управляемые блоки подобного размера.

Если бы это только об аватарах, я сделал бы:

  1. Используйте хеш (например, SHA1) изображения
  2. Используйте SHA1 в качестве имени файла и имени каталога

Например, кэш сверхпроводящего квантового интерферометра делает это этот путь:

f/4b/353ac7303854033

Каталог верхнего уровня является первым шестнадцатерично-разрядным, вторым уровнем, следующие две шестнадцатеричных цифры, и имя файла является остающимися шестнадцатеричными цифрами.

7
ответ дан 2 December 2019 в 22:20

Я взломал вместе небольшую веб-галерею, где я закончил с изменением этой проблемы; у меня "только" было ~30.000 изображения в каталоге кэша, который оказался довольно медленным (ext2, использует связанные списки для индексов каталога, поскольку я помню это).

Я закончил тем, что делал что-то вдоль этих строк:

def key2path(key):
    hash = md5(key)
    return os.path.join(hash[0], hash[1], key)

Это разделит данные в 256 каталогах, которые дают быстрый поиск каталога для каждого из этих трех уровней.

  • Я принял решение использовать MD5 по SHA-1, поскольку MD5 гарантирует другой вывод, если Вы изменитесь на какие-либо 12 битов 32, таким образом, я нахожу это хорошим соответствием для хеширования имен пользователей, каталогов и другого короткого материала. И это быстро, также...
  • Я не включаю весь хеш, поскольку он произведет слишком много каталогов и эффективно повредит дисковый кэш много раз.
1
ответ дан 2 December 2019 в 22:20
  • 1
    Вы могли, вероятно, использовать более простой хеш как CRC, поскольку хеш не должен быть криптографически сильным как MD5 или SHA..., но различие в производительности, вероятно, незначительно так или иначе... –  sleske 27 July 2009 в 13:54

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

Вот (более старое) техническое описание Microsoft по теме: К BLOB или не к BLOB.

1
ответ дан 2 December 2019 в 22:20

Не непосредственное решение Вашей проблемы, но что-то для наблюдения для дальнейшего использования является OpenBSD связанный проект под названием 'Воплощение'

Воплощение является механизмом, который обеспечивает Хранение единственного экземпляра, Ассоциативное запоминающее устройство и услуги по Дедупликации.

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

Воплощение в настоящее время экспериментально, но что-то для наблюдения за будущим.

0
ответ дан 2 December 2019 в 22:20

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

Конечно, если у Вас будет сложное приложение, которое полагается на плоскую структуру каталогов, то Вам, вероятно, будет нужно большое исправление. Таким образом, хорошо знать, что существует обходное решение, используйте символьные ссылки, который не имеет упомянутого предела 32k. Затем у Вас есть много времени для фиксации приложения...

0
ответ дан 2 December 2019 в 22:20

Как правило, вы не хотите иметь каталоги с большим количеством файлов / каталогов в них. Основная причина заключается в том, что использование подстановочных знаков в командной строке приведет к ошибке «Слишком много аргументов», что приведет к серьезным затруднениям при попытке работать с этими каталогами.

Найдите решение, которое делает более глубокое, но более узкое дерево, например, путем создания подпапки, подобные описанным ранее.

0
ответ дан 2 December 2019 в 22:20

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

Например

Допустим, ваша отметка времени: 1366587600

Опустите последние 2 цифры (или иначе это становится немного смешным). Разделите штамп на наборы по 4 (количество каталогов не должно превышать 9999 - если вы хотите, вы можете разделить его по-другому).

В результате у вас должно получиться что-то вроде этого:

/files/1366/5876/

Затем также проверьте количество в каталоге перед загрузкой, если он получает большое количество загрузок (например, 32000 + за 100 секунд), затем перебирайте каталог по секундам или букве, например:

/files/1366/5876/a/file.txt

или

/files/1366/5876/00/file.txt

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

pathstamp: 1366587600 или 13665876a (если вы используете буквы).

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

0
ответ дан 2 December 2019 в 22:20

Я бы посоветовал решить, сколько максимальных подкаталогов вы хотите (или можете) иметь в родительской папке.

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

Тогда вы можете: modulo = currentId% numberOfSubdirectories

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

Делайте все, что хотите, с модулем, хэшируйте его , например.

Также таким образом подкаталоги будут заполняться линейно.

0
ответ дан 2 December 2019 в 22:20

Теги

Похожие вопросы