例如,我想添加数据库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,而这些问题并没有。
答案 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())