LINUX.ORG.RU

django хранение большого кол-ва jpg

 ,


0

5

Допустим, нужно хранить много image. Если складывать в одну директорию, то:

1. файловую система начнет тормозить на большом кол-ве файлов
2. неудобно масштабировать это

Как правильно(и есть ли батарейки готовые), чтобы правильно загружать и каким-то правильным способом хранить image?


Насколько много и по какой временному промежутку размазано?

Zhbert ★★★★★
()

Ceph + s3, если есть возможность.

Hanuken
()

Если складывать в одну директорию

Ну разложи их по годам/месяцам/неделям/дням, чего ты как маленький

В крайнем случае можно хоть в БД хранить картинки, но это совсем в крайнем.
Обычно более чем достаточно просто примонтировать что надо и хранить там.

И не забудь изучить https://docs.djangoproject.com/en/dev/topics/files/

Goury ★★★★★
()
Ответ на: комментарий от Goury

мне надо чтобы без базы было. Чтобы я загрузил файл и мне в ответ прилетел путь до загруженного файла

Xwo
() автор топика

Можно хранить их на CDN, для Django есть готовые батарейки для этого. Хранить картинки в базе данных даже не думай. Это приведет к куче проблем и трудностей. А вообще, если тебе CDN не подходит по какой-то причине, то у Джанговского ImageField есть свойство upload_to. Можешь сделать так, чтобы у тебя в /media создавались папки для текущей даты - и картинки сохранялись в соответствующую папку. Вот пример (в моем случае тут еще некоторая функциональность есть типа проверки одинаковых названий у файлов, но она не помешает понять, что я имею в виду):

def get_upload_path(instance, filename):
    now = timezone.now()
    today = now.strftime("%Y-%m-%d")
    name, ext = os.path.splitext(filename)
    slug = slugify(name)

    thumbnail_prefix = "thumbnails" if instance.type.startswith('thumb') else ""

    file_path_mask = os.path.join(thumbnail_prefix, today, "%s" % slug).lower()

    doubles_count = MediaFile.objects.filter(file__startswith=file_path_mask).count()
    if doubles_count != 0:
        return os.path.join(thumbnail_prefix, today, "%s-%d%s" % (slug, doubles_count, ext)).lower()
    return os.path.join(thumbnail_prefix, today, "%s%s" % (slug, ext)).lower()

...

class ImagesStorage(models.Model):
    file = models.ImageField(upload_to=get_upload_path)

dimuska139 ★★
()
Ответ на: комментарий от dimuska139

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

dimuska139 ★★
()
Ответ на: комментарий от dimuska139

Тьфу, там вместо MediaFile должно быть ImagesStorage. Ну, ты понял)

dimuska139 ★★
()

файловую система начнет тормозить на большом кол-ве файлов

Ну так складывай не в одну директорию, а в разные. Например images/2019-10-21/Filaname666.jpg

anonymous
()
Ответ на: комментарий от Xwo

Ну вот и почитай как сделать такой FileSystemStorage

Goury ★★★★★
()

Как правильно

Хз. Пошукай про хранение в cbz.

anonymous
()

Как уже сказали - самый простой вариант раскидать по каталогам. год/месяц/день/

Я у себя на мини-хостинге картинок делаю так - https://pic4a.ru/910/mA5.jpg 910 - имя каталога, 9 - последняя цифра года, 10 - месяц. Но там и файлов мало. (Сейчас всего ~20к+). Плюс хотелось короткие урлы для файлов.

pi11 ★★★★★
()

getdents64()

anonymous
()

А как это сделано в Инстаграме, который на Django?

EXL ★★★★★
()

XFS можно заюзать.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.