2013-10-10 177 views
1

我试图提供使用2套夹具的初始数据。第一个灯具格式看起来像这样。Django夹具加载非常缓慢

{ 
    "pk": 1, 
    "model": "data.Person", 
    "fields": { 
     "full": "Anna-Varney", 
     "num": "I", 
     "short": "Anna-Varney" 
    } 
    }, 

而我首先加载它,并在大约1-2小时内加载罚款。我movie.json格式如下:

{ 
    "pk": 1, 
    "model": "data.Film", 
    "fields": { 
     "date": "2005-08-01", 
     "rating": 8.3, 
     "actors": [ 
     [ 
      "Anna-Varney" 
     ] 
     ], 
     "name": "Like a Corpse Standing in Desperation (2005) (V)" 
    } 
    }, 

和装载在迈出了非常长的时间看电影夹具,这是目前20个小时,并在运行时我的电脑是缓慢的。我在2个月前加载了类似的灯具,除了我使用了MySQL(我现在使用Postgres)以及我在模型中添加了日期字段。在过去将电影装置加载到旧的MySQL数据库中时,只需要2-3个小时。有没有办法确定夹具加载部件在哪一步或者是否已冻结?

仅供参考我的车型有:

class PersonManager(models.Manager): 
    def get_by_natural_key(self, full): 
     return self.get(full=full) 

class Person(models.Model): 
    objects = PersonManager() 
    full = models.CharField(max_length=100,unique = True) 
    short = models.CharField(max_length=100) 
    num = models.CharField(max_length=5) 
    def natural_key(self): 
     return (self.full,) 

    def __unicode__(self): 
     return self.full 


class Film(models.Model): 
    name = models.TextField() 
    date = models.DateField() 
    rating = models.DecimalField(max_digits=3 , decimal_places=1) 
    actors = models.ManyToManyField('Person') 

    def __unicode__(self): 
     return self.name 
+0

我想尝试的第一件事是在'full'上创建一个索引。自然键处理必须为每部电影找到正确的'Person'实例,所以它会反复搜索'full'。 –

+0

好的,我会尝试。如果我的应用大量使用Twitter的typeahead.js和一个调用istartswith的视图,我是否也应该将这个short做索引? – dl8

+0

我不确定 - 这取决于'istartswith'查询发送到Postgres的方式。 –

回答

0

因为Django的在自动提交模式下运行它要求一个数据库,真正做到确保所创建的每一个对象后,那么它会立即保存和同步到驱动器盘片上的物理位置。这限制了保存到磁盘盘片速度的对象数量。

您需要使用@transaction.atomic修饰符或with transaction.atomic():上下文管理器来允许数据库确保所有内容都安全地保存一次 - 最后。您可以阅读more about transactions in Django documentation

当使用PostgreSQL和Django时,我甚至建议在数据库配置中设置ATOMIC_REQUESTSTrue。这样,每个浏览器请求都将自动在一个事务中提供,并且只有在结果视图能够成功运行时才提交。

+0

我究竟在哪里应用这些?交易文档主要将它们应用于视图,但我现在的问题只是试图通过固定装置将数据加载到数据库中。 – dl8

+0

我不太了解Django,但我不认为装置是用于批量数据加载的。我认为他们正在像我描述的那样保存对象 - 一次一个。也许在数据库配置中将此ATOMIC_REQUESTS设置为True将使它们在一个事务中运行,并加速它。 – Tometzky

+0

我在一个月前添加了大致相同数量的数据,除了我使用MySQL和非常不同的模型。夹具加载得很好。出于某种原因改为Postgres并调整模型有点让它加载非常缓慢(或加载时冻结)。我不认为ATOMIC_REQUESTS会做任何事情,因为它与HTTP请求绑定在一起,而我现在没有处理任何事情,我只是试图将初始数据加载到我的数据库中。 – dl8