Python Django-为批量创建创建模型实例
例如,我想向db添加100万个条目(超过400mb),我从文件中读取这些条目并将其附加到数组中,如果数组长度超过1000,我将调用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 =
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
?