Хранение большого количества файлов на сервере
1649 сообщений
#12 лет назад
Есть необходимость хранения большого количество файлов на WEB сервере - картинки размером от 20 до 300кб.Как лучше хранить? Все в одной папке или разбить на подпапки? В чем преимущество первого и второго метода?
На данный момент 100 000 файлов в одной папке, все работает нормально. При каких объемах могут возникать проблемы? ОС CentOS - VPS.
Стоить менять архитектуру приложения, и разбить все на подпапки?
Если у кого есть ссылки на хорошую документацию, буду благодарен.
PS: Листинг файлов не нужен. Идет только прямое обращение к конкретному файлу.
263 сообщения
#12 лет назад
Цитата ("WebDesignStudio"):Есть необходимость хранения большого количество файлов на WEB сервере - картинки размером от 20 до 300кб.
Как лучше хранить? Все в одной папке или разбить на подпапки?
Начиная от 300-500К файлов/директории, лучше хранить в поддиректориях.
Цитата ("WebDesignStudio"):
В чем преимущество первого и второго метода?
Первый метод (Вы это уже заметили) проще в реализации. Второй метод - при большом количестве файлов - становится гораздо быстрее в работе: часть директории кешируется в буфере файловой системы и очень длинная директория в буфер не влезет, поэтому для того, чтобы найти файл, файловой системе придется читать директорию с диска, а это одна или несколько операций чтения. Эта задержка может привести к тому, что Ваша программа будет выгружена из памяти и общая задержка за счет поиска/загрузки/выгрузки может составить несколько секунд.
Цитата ("WebDesignStudio"):
На данный момент 100 000 файлов в одной папке, все работает нормально.
Это пока все работает. Когда в Вашей программе обнаружится ошибка и Вам понадобится, например, проверить время создания или аттрибуты файла, Вы обнаружите некоторые неудобства такого метода хранения данных.
Цитата ("WebDesignStudio"):
При каких объемах могут возникать проблемы? ОС CentOS - VPS.
Стоить менять архитектуру приложения, и разбить все на подпапки?
Решать Вам. Я в такой ситуации хранил все данные в таблице mysql, но там речь шла о миллионах файлов. В общем случае, VPS это не самое лучшее место для таких задач: медленно и ненадежно. Предпочтительнее использовать выделенный сервер и файловую систему ReiserFS или ext4, монтировать с параметром noatime.
1649 сообщений
#12 лет назад
Решил делать вот как.Создать 100 папок(0-99) - сотни тысяч
В каждой папке создать еще по 100 папок(0-99) - тысячи
Разделить файлы, в каждой папке файлы 1000 объектов(у каждого объекта от 0 до 10 файлов).
так получится что в папке будет до 10 000 максимум. На практике, после деления файлов там до 5000.
Если например объект 101, от будет находится в папке 0/0. Если объект 1200, он будет в папке 0/1. Объект 30000 в папке 0/30. Объект 125000 будет в папке 1/25.
Как такой подход, по идее должно работать быстрее, хотя и получится 10 000 папок(2 уровня)? Таким образом получится хранить файлы от 10 миллионов объектов, хотя на практике не дойдем до такой цифры, максимум там будет до 1 миллиона.
Как то хранить в базе не решаюсь, сейчас уже есть 6 гигов таких файлов, и их объем будет расти. База получится медленной.
1895 сообщений
#12 лет назад
Разницы нет, если вам нужно искать/сканировать файлы/папки, тогда разница будет, если вы точно знаете имя файла (к примеру храните в БД), и вам его просто нужно выдать клиенту, то никакой разницы не будет, ограничения конечно есть, но они такие заоблачные что врятлы в них упретесь
1649 сообщений
#12 лет назад
MMM_Corp, так что можно и дальше держать все в одну папку или как?
2817 сообщений
#12 лет назад
Решал подобную задачу следующим образом:имя файла генерировал md5-функцией, разбивал 32-значное имя на 3 символа, полученное множество последовательно проходил и шел в "глубь", создавая подкатегории которых нет перед сохранением файла.
999 файлов в одной папке норм (можно до 99 сократить), в результате с дофигищем картинок можно было норм.работать.
Все в одной папке хранить не стоит, перейдя некий порог файловые операции будут занимать слишком много времени для этого каталога.
1649 сообщений
#12 лет назад
ArtPro, не знаю какая файловая система. наверное ext3 или 4. Это важно? Читал что есть разные ограничения, но они есть везде.Цитата ("kirilev"):
Все в одной папке хранить не стоит, перейдя некий порог файловые операции будут занимать слишком много времени для этого каталога.
я уже с эти столкнулся когда нужно было делать перенос.
Цитата ("kirilev"):
имя файла генерировал md5-функцией, разбивал 32-значное имя на 3 символа
можно и так, но это не очень понятно что и где находятся. Мой метод позволяет быстрее найти нужный файл и удалить вручную например.