Django - 为bulk_create创建模型实例

时间:2014-07-14 23:14:35

标签: python django

例如,我想添加数据库100万条目(超过400mb),我从文件读取并将条目追加到数组中,如果数组长度超过1000我调用bulk_create,但这个脚本带内存泄漏..为什么?..

# python 3
# models.py 
class Item(models.Model):
    name1 = models.TextField()
    name2 = models.TextField()
    name3 = models.TextField()
    name4 = models.TextField()
    name5 = models.TextField()
    name6 = models.TextField()
    name7 = models.TextField()
    name8 = models.CharFiled(max_length=150, unique=True)

# action
with open('items.txt') as file_object: 
    items = []
    for line in file_object:
        item_data = line.strip().split(';')

        i = Item(
            name1=item_data[0],
            name2=item_data[1],
            name3=item_data[2],
            name4=item_data[3],
            name5=item_data[4],
            name6=item_data[5],
            name7=item_data[6],
            name8=item_data[7],
            name9=item_data[8],
        )

        items.append(i)

        if len(items) > 1000: 
            Item.objects.bulk_create(items)
            del items[:]

有时脚本会引发错误

  

django.db.utils.DatabaseError:在' 127.0.0.1:3306'与MySQL服务器的连接丢失,系统错误:10054

为什么?..


之前,我使用的是SQLAlchemy,而这些问题并没有。

1 个答案:

答案 0 :(得分:0)

你可以尝试这样的事情。我没有运行此代码但你会得到一个想法

with open('items.txt') as file_object:
    num_lines = sum(1 for line in open('items.txt'))
    def _get_items():
        for counter, line in enumerate(file_object):
            item_data = line.strip().split(';')

            i = Item(
                name1=item_data[0],
                name2=item_data[1],
                name3=item_data[2],
                name4=item_data[3],
                name5=item_data[4],
                name6=item_data[5],
                name7=item_data[6],
                name8=item_data[7],
                name9=item_data[8],
            )
            yield i
            if counter == 1000:
                break

    for i in num_lines / 1000:
        Item.objects.bulk_create(_get_items())