2013-10-10 6 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» для каждого фильма, поэтому он постоянно ищет «полный». –

+0

Хорошо, я попробую. Если мое приложение сильно использует twart's typeahead.js с представлением, которое вызывает istartswith для краткости, должен ли я также сделать короткий индекс? – dl8

+0

Я не уверен в этом - это будет зависеть от того, как именно запрос 'istartswith' отправляется в Postgres. –

ответ

0

Поскольку Django работает в режиме автоматической фиксации он запрашивает базу данных, чтобы быть действительно уверены, что после того, как каждый объект создается, то он будет немедленно сохранен и синхронизируются к физическое расположение на диске. Это ограничивает количество объектов, сохраненных на скорости дисковых пластин.

Чтобы использовать базу данных, убедитесь, что все сохранено безопасно только один раз - в конце. Вы должны использовать декоратор @transaction.atomic или with transaction.atomic():.

Вы можете прочитать more about transactions in Django documentation.

Я бы даже рекомендовал установить ATOMIC_REQUESTS на True в конфигурации базы данных при использовании PostgreSQL с Django. Таким образом, каждый запрос браузера будет автоматически подаваться в одной транзакции и совершается только в том случае, если результирующее представление будет успешно запущено.

+0

Куда бы я их применил? Документация транзакций в основном применяет их к представлениям, но сейчас моя проблема просто пытается загрузить данные в базу данных с помощью приборов в первую очередь. – dl8

+0

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

+0

Я добавил примерно то же количество данных месяц назад, за исключением того, что использовал MySQL и очень немного разные модели. Светильники загружены нормально. По какой-то причине изменение Postgres и настройка моделей немного заставляют его загружаться очень медленно (или замораживать при загрузке). И я не думаю, что ATOMIC_REQUESTS будет делать что-либо, поскольку это связано с запросами HTTP, и я не имею никакого отношения к этому, прямо сейчас, я просто пытаюсь загрузить исходные данные в свою базу данных. – dl8

Смежные вопросы