Каков оптимальный способ хранения 100 000 ежедневных вставок в базу данных в Django? - PullRequest
0 голосов
/ 06 апреля 2019

Моя проблема заключается в том, что Django вставляет записи waaaaaaay слишком медленно (я даже не время, но это было более 5 минут) для 100k записей из файла CSV Pandas.Я занимаюсь синтаксическим анализом CSV-файла, а затем сохраняю эти объекты в postgresql в Django.Это будет ежедневный cronjob с CSV-файлами, отличающимися для большинства записей (некоторые могут быть дубликатами предыдущих дней или владелец может быть тем же)

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

class TrendType(models.Model):
    """ Описывает тип отчета (посты, видео, субъекты)"""
    TREND_TYPE = Choices('video', 'posts', 'owners') ## << mnemonic

    title = models.CharField(max_length=50)
    mnemonic = models.CharField(choices=TREND_TYPE, max_length=30)


class TrendSource(models.Model):
    """ Источник отчета (файла) """
    trend_type = models.ForeignKey(TrendType, on_delete=models.CASCADE)
    load_date = models.DateTimeField()
    filename = models.CharField(max_length=100)


class TrendOwner(models.Model):
    """ Владелец данных (группа, юзер, и т.п.)"""
    TREND_OWNERS = Choices('group', 'user', '_')

    title = models.CharField(max_length=50)
    mnemonic = models.CharField(choices=TREND_OWNERS, max_length=30)


class Owner(models.Model):
    """ Данные о владельце """
    link = models.CharField(max_length=255)
    name = models.CharField(max_length=255)
    trend_type = models.ForeignKey(TrendType, on_delete=models.CASCADE)
    trend_owner = models.ForeignKey(TrendOwner, on_delete=models.CASCADE)


class TrendData(models.Model):
    """ Модель упаковка всех данных """
    owner = models.ForeignKey(Owner, on_delete=models.CASCADE)
    views = models.IntegerField()
    views_u = models.IntegerField()
    likes = models.IntegerField()
    shares = models.IntegerField()
    interaction_rate = models.FloatField()
    mean_age = models.IntegerField()
    source = models.ForeignKey(TrendSource, on_delete=models.CASCADE)
    date_trend = models.DateTimeField() # << take it as a date

В принципе, мне бы хотелось хорошее решение для «быстрой» вставки в базу данных ивозможно ли это даже с учетом этих моделей.

Ответы [ 2 ]

0 голосов
/ 06 апреля 2019

Проблема не в django, а в самом postgresql.Мое предложение будет изменить ваш бэкэнд.Postgresql хорош для данных ОБНОВЛЕНИЯ, но есть лучшие базы данных для данных INSERT. Postgresql vs TimescaleDB Однако я не думаю, что для TimescaleDB есть django ORM.

Я бы предложил использовать Redis.Основное использование - это кэш в памяти, но вы также можете использовать его для сохранения ваших данных.И есть также ORM для Python с Redis под названием ROM

0 голосов
/ 06 апреля 2019
  1. Может быть, вам не нужен ORM здесь? Вы можете попробовать реализовать простую оболочку вокруг типичных запросов SQL
  2. Использовать массовое чтение / запись, используя bulk_create () в Django ORM или в вашей оболочке

Чек https://docs.djangoproject.com/en/2.2/topics/db/optimization/

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