Сохранение пользовательских изображений - достижение максимального предела папки - PullRequest
1 голос
/ 26 сентября 2011

Я использую ext3 и, согласно Википедии , максимально допустимые подкаталоги составляют около 32000. В настоящее время каждому пользователю предоставляется свой собственный каталог для загрузки изображений в файловой системе.Это упрощает получение изображений и облегчает доступ.структура папок выглядит следующим образом:

../images/<user id>/<image>
../images/<another user id>/<image>

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

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

Ответы [ 3 ]

2 голосов
/ 26 сентября 2011

У вас может быть многоуровневая иерархия, где каждый уровень гарантированно никогда не превысит максимум.

Например, если ваши идентификаторы пользователя определены с помощью регулярного выражения [A-Za-z0-9 _] +, у вас есть 64 возможных варианта выбора для любого данного символа (я добавляю пробел в счет пробелов в конце когда идентификаторы короче). Взяв два символа вместе, вы получите 64 * 64 = 4096 возможностей. Вы не можете использовать три символа, так как это приведет к превышению вашего лимита. Затем с помощью этой информации вы можете создать каталоги, разделив идентификаторы на группы по две буквы. Пример: идентификаторы пользователя "miguel" и "miguel12345" будут идти по адресу:

/images/mi/gu/el/<image>
/images/mi/gu/el/12/34/5/<image>

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

Удачи!

1 голос
/ 26 сентября 2011

Создать подкаталог для случая, когда предыдущий заполняется

/images/<a>/<user id 1>/<image>
/images/<a>/<user id 2>/<image>
...
/images/<a>/<user id 32000>/<image>
/image/<b>/<user id 32001>/<image>
...
0 голосов
/ 26 сентября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...