我的问题是,对于熊猫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
基本上,我希望为“快速”插入数据库提供一个好的解决方案,并且即使使用这些模型,它也可能实现。
答案 0 :(得分:0)
选中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