Найти - Пользователи
Полная версия: Медленно создаётся 10000 объектов моделей со связью ForeignKey
Начало » Django » Медленно создаётся 10000 объектов моделей со связью ForeignKey
1
buddha
Мне честно говоря не с чем сравнить.
Есть две модельки, взятые с потолка:
class Book(models.Model):
    author = models.ForeignKey('Author')
    title = models.CharField(max_length=100)
    page_count = models.IntegerField()
    exists = models.BooleanField()
    chars_count = models.BigIntegerField()
    digit_version = models.BinaryField()
    important_pages = models.CommaSeparatedIntegerField(max_length=1000)
    wrote = models.DateField(auto_now=True)
    published = models.DateTimeField(auto_now=True)
    cost = models.DecimalField(max_digits=65, decimal_places=2)
    sale_cost = models.FloatField()
    image = models.ImageField(upload_to='media')
    book_addition = models.FileField(upload_to='media')
 
 
class Author(models.Model):
    name = models.CharField(max_length=100)
    mail = models.EmailField(max_length=254)

дальше создаю 10000 авторов и книг, так вот 10000 авотров создаются почти моментально, а вот 10000 книг создаются около 17секунд. Это нормально?!
RECORDS_COUNT = 10000
 
objs_list = []
for i in range(RECORDS_COUNT):
    obj = Author(name='author_'+str(i), mail='author_'+str(i)+'@djangomail.de')
    objs_list.append(obj)
Author.objects.bulk_create(objs_list)
      
objs_list.clear()
authors = Author.objects.all()
for i in range(RECORDS_COUNT):
    obj = Book(author=authors[i], title='book_'+str(i), page_count=300, exists=True, chars_count=300000, cost=347.77, sale_cost=244.07)
    objs_list.append(obj)
Book.objects.using(db_engine_name).bulk_create(objs_list)
Lexander
Прежде, чем копать.
Вы уверенны, что дело именно в Django, а не в СУБД (прирост базы, блокировки, тормозящие при создании индексы и т.п.)?
Lexander
Какой результат, если уменьшить batch_size?
Очень похоже на контроль внешнего ключа на каждую запись книги - ForeignKey тормозить может.
buddha
Я не очень вопрос правильно сформулировал.
Метод Book.objects.using(db_engine_name).bulk_create(objs_list) выполняется около 1.6 сек.
А вот эта конструкция около 17 сек.:
objs_list.clear()
authors = Author.objects.all()
for i in range(RECORDS_COUNT):
    obj = Book(author=authors[i], title='book_'+str(i), page_count=300, exists=True, chars_count=300000, cost=347.77, sale_cost=244.07)
    objs_list.append(obj)

П.С.: кстати плохо отступы в блоке кода сделал. Поправил.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB