Я также столкнулся с этим некоторое время, потому что мы использовали стандартную аутентификацию. Чтобы поисковый робот работал, он должен смочь использовать интегрированную аутентификацию для получения до сайта. Кроме того, я нашел, что, чтобы заставить это работать, я должен был настроить веб-приложение по умолчанию, чтобы использовать интегрированную аутентификацию и затем использовать расширенное веб-приложение для других схем аутентификации.
Тот предел на каталог, не для целой файловой системы, таким образом, Вы могли работать вокруг этого дальнейшими вещами подразделения. Например, вместо того, чтобы иметь все пользовательские подкаталоги в том же каталоге разделяет их на первые два символа имени, таким образом, у Вас есть что-то как:
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 может сделать также), а также фиксированный предел на каталог.
Наклон у нас есть лучшее решение?
У Вас действительно есть лучшее решение - используют другую файловую систему, существуют много доступные, многие из которых оптимизированы для различных задач. Поскольку Вы указали, что ReiserFS оптимизирован для обработки большого количества файлов в каталоге.
Посмотрите здесь для сравнения файловых систем.
Просто радуйтесь, что Вы не застреваете с NTFS, который действительно плачевен для большого количества файлов в каталоге. Я рекомендовал бы JFS как замену, если Вы не представляете себе использовать относительно новое (но по-видимому стабильный) ext4 FS.
Если Вы связываетесь с ext2/ext3 единственная возможность, я вижу, должен разделить Ваши данные. Найдите критерий, который разделяет Ваши данные на управляемые блоки подобного размера.
Если бы это только об аватарах, я сделал бы:
Например, кэш сверхпроводящего квантового интерферометра делает это этот путь:
f/4b/353ac7303854033
Каталог верхнего уровня является первым шестнадцатерично-разрядным, вторым уровнем, следующие две шестнадцатеричных цифры, и имя файла является остающимися шестнадцатеричными цифрами.
Я взломал вместе небольшую веб-галерею, где я закончил с изменением этой проблемы; у меня "только" было ~30.000 изображения в каталоге кэша, который оказался довольно медленным (ext2, использует связанные списки для индексов каталога, поскольку я помню это).
Я закончил тем, что делал что-то вдоль этих строк:
def key2path(key):
hash = md5(key)
return os.path.join(hash[0], hash[1], key)
Это разделит данные в 256 каталогах, которые дают быстрый поиск каталога для каждого из этих трех уровней.
Действительно ли аватар является маленьким? Что относительно того, чтобы поместить его в базу данных с остальной частью данных профиля? Это не могло бы быть наилучшим вариантом для Вас, но достойный рассмотрения...
Вот (более старое) техническое описание Microsoft по теме: К BLOB или не к BLOB.
Не непосредственное решение Вашей проблемы, но что-то для наблюдения для дальнейшего использования является OpenBSD связанный проект под названием 'Воплощение'
Воплощение является механизмом, который обеспечивает Хранение единственного экземпляра, Ассоциативное запоминающее устройство и услуги по Дедупликации.
Все Ваши данные хранятся в хранилище данных как хешированные блоки, удаляя групповые блоки для сокращения использования пространства, и позволяют Вам по существу забывать о механизме хранения, поскольку можно просто запросить содержание от хранилища данных UUID.
Воплощение в настоящее время экспериментально, но что-то для наблюдения за будущим.
У нас была подобная проблема, решение - как упомянуто ранее - состоит в том, чтобы создать иерархию каталогов.
Конечно, если у Вас будет сложное приложение, которое полагается на плоскую структуру каталогов, то Вам, вероятно, будет нужно большое исправление. Таким образом, хорошо знать, что существует обходное решение, используйте символьные ссылки, который не имеет упомянутого предела 32k. Затем у Вас есть много времени для фиксации приложения...
Как правило, вы не хотите иметь каталоги с большим количеством файлов / каталогов в них. Основная причина заключается в том, что использование подстановочных знаков в командной строке приведет к ошибке «Слишком много аргументов», что приведет к серьезным затруднениям при попытке работать с этими каталогами.
Найдите решение, которое делает более глубокое, но более узкое дерево, например, путем создания подпапки, подобные описанным ранее.
Почему бы не использовать подход с отметкой времени, а затем иметь опцию переполнения.
Допустим, ваша отметка времени: 1366587600
Опустите последние 2 цифры (или иначе это становится немного смешным). Разделите штамп на наборы по 4 (количество каталогов не должно превышать 9999 - если вы хотите, вы можете разделить его по-другому).
В результате у вас должно получиться что-то вроде этого:
/files/1366/5876/
Затем также проверьте количество в каталоге перед загрузкой, если он получает большое количество загрузок (например, 32000 + за 100 секунд), затем перебирайте каталог по секундам или букве, например:
/files/1366/5876/a/file.txt
или
/files/1366/5876/00/file.txt
Затем зарегистрируйте метку времени + букву или полный код пути в базу данных вместе с пользователем, и вы должны быть установлены.
pathstamp: 1366587600 или 13665876a (если вы используете буквы).
В итоге получается большое количество каталогов, но это может быть действительно полезно для обработки ревизий файлов. Например, если пользователь хочет использовать новое изображение профиля, у вас все еще есть старая версия с меткой времени на тот случай, если они захотят отменить изменения (а не просто перезаписать).
Я бы посоветовал решить, сколько максимальных подкаталогов вы хотите (или можете) иметь в родительской папке.
Затем вам нужно преобразовать свой идентификатор пользователя, чтобы они начинались с 1.
Тогда вы можете:
modulo = currentId% numberOfSubdirectories
modulo
теперь будет содержать номер вашего подкаталога, который никогда не будет больше, чем numberOfSubdirectories
, который вы выбрали.
Делайте все, что хотите, с модулем, хэшируйте его , например.
Также таким образом подкаталоги будут заполняться линейно.