Сергей К.
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, так что можно и дальше держать все в одну папку или как?
Николай М.
1895 сообщений
#12 лет назад
Да можно спокойно
Сергей К.
1649 сообщений
#12 лет назад
Вот как сделал
Евгений Б.
5330 сообщений
#12 лет назад
Файловая система то какая??
Кирилл Е.
2817 сообщений
#12 лет назад
Решал подобную задачу следующим образом:
имя файла генерировал md5-функцией, разбивал 32-значное имя на 3 символа, полученное множество последовательно проходил и шел в "глубь", создавая подкатегории которых нет перед сохранением файла.

999 файлов в одной папке норм (можно до 99 сократить), в результате с дофигищем картинок можно было норм.работать.

Все в одной папке хранить не стоит, перейдя некий порог файловые операции будут занимать слишком много времени для этого каталога.
Сергей К.
1649 сообщений
#12 лет назад
ArtPro, не знаю какая файловая система. наверное ext3 или 4. Это важно? Читал что есть разные ограничения, но они есть везде.
Цитата ("kirilev"):
Все в одной папке хранить не стоит, перейдя некий порог файловые операции будут занимать слишком много времени для этого каталога.

я уже с эти столкнулся когда нужно было делать перенос.
Цитата ("kirilev"):
имя файла генерировал md5-функцией, разбивал 32-значное имя на 3 символа

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