在Django中每天存储10万个数据库插入的最佳方法是什么?

时间:2019-04-06 16:48:35

标签: python django pandas django-models

我的问题是,对于熊猫csv文件中的100k条目,Django插入waaaaaaay的速度太慢(我什至没有时间,但超过5分钟)。我正在做的是解析csv文件,然后将这些对象保存到Django中的postgresql。大部分条目将每天与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 :(得分:0)

  1. 也许您在这里不需要ORM?您可以尝试围绕典型的SQL请求实现一个简单的包装程序
  2. 在Django ORM或您的包装器中使用bulk_create()进行批量读/写

选中https://docs.djangoproject.com/en/2.2/topics/db/optimization/

答案 1 :(得分:0)

问题不在于Django,而在于postgresql本身。我的建议是更改您的后端。 Postgresql适合UPDATE数据,但是有更好的INSERT数据数据库。 Postgresql vs TimescaleDB但是,我认为TimescaleDB没有Django ORM。

我的建议是使用Redis。主要用途是缓存在内存中,但您也可以使其持久化数据。还有一个带Redis的Python ORM,称为ROM