Проблематика
- Большое количество файлов в одной директории уменьшает скорость доступа и увеличивает нагрузку на систему
- Большое количество поддиректорий занимает большое количество дисковой памяти. К примеру, одна директория в EXT3 стандартно занимает 4КБ на носителе.
- Файлы необходимо переименовывать таким образом, чтобы избегать конфликтов имен и сделать невозможным некоторые разновидности атак
Простое, но эффективое решение под катом
- При загрузке файла на сервер, через интерфейс веб-сервиса, переименовываем его в шестнадцатеричный хеш, добавляя расширение. К примеру PHP md5(rand()).$ext
- Вынимаем из нового имени первые символы. Проверяем существование, или создаем новую поддиректорию с именем, равным этим символам. Пишем в нее файл.
- При необходимости — сохраняем оригинальное имя файла, путь и его статистику в БД. Выдаем красивое имя HTTP-заголовком при скачивании.
Что получаем?
- Достаточно оптимальное решение для хранения заведомо большого количества файлов. В некотором общем случае имеем не более 256 поддиректорий, которые занимают 1МБ на носителе. В случае достижения некоторой «перегрузки» возможно увеличивать глубину хранения, без внесения изменений в существующую структуру — просто увеличивая глубину «рекурсии».
- Современные хеширующие алгоритмы сильны, но микровероятность конфликта все-же присутствует, и она увеличивается с ростом количества хранимых файлов. Один из простых способов перестраховаться — проверять существование файла с аналогичным именем перед сохранением нового. Языки программирования имеют достаточно быструю функцию для этого, например PHP is_file().
- Достаточно равномерное распределение файлов по директориям. Это нормализует нагрузку, а также позволяет использовать распределенные хранилища, и легко масштабировать их при эксплуатации.
- Удобно программировать в различных ситуациях — возможно абстрагировать систему поддиректорий, как числа в шестнадцатеричной системе счисления.
Данная методика отлично проявляет себя на практике. Именно таким образом реализовано хранение файлов как минимум одного популярного публичного хостинга, работает давно и стабильно.
http://habrahabr.ru/blogs/webdev/115161/