Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django-为批量创建创建模型实例_Python_Django - Fatal编程技术网

Python Django-为批量创建创建模型实例

Python Django-为批量创建创建模型实例,python,django,Python,Django,例如,我想向db添加100万个条目(超过400mb),我从文件中读取这些条目并将其附加到数组中,如果数组长度超过1000,我将调用bulk\u create,但此脚本存在内存泄漏。。为什么 # python 3 # models.py class Item(models.Model): name1 = models.TextField() name2 = models.TextField() name3 = models.TextField() name4 =

例如,我想向db添加100万个条目(超过400mb),我从文件中读取这些条目并将其附加到数组中,如果数组长度超过1000,我将调用
bulk\u 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,而这样的问题不是。

您可以尝试类似的方法。我没有运行此代码,但您会有一个想法

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())

这可能不是错误的原因,但在我看来,您正在for循环中调用bulk_create,但您可能希望在for循环运行后调用它?@kreld如果我将所有(超过100万)模型实例保留在一个变量中,将加载到超过700mb的内存中。正是出于这个原因,我在1000项之后调用
bulk\u create
。也许你可以尝试使用生成器而不是for循环?@AndreyZarubin你能举个例子吗?。。为什么它可以帮助我解决内存泄漏问题?@AndreyZarubin,因为我可以创建迭代器,但在这种情况下如何使用
bulk\u creator