我正在尝试使用bulk_create,但它仅创建一个对象,而不是我规定的batch_size。我为batch_size使用了一个变量,所以也许是问题所在,但我想不出为什么它应该是个问题。这是代码:
12,152,832
17,539,072
17,924,096 # At this point, the original code was above 18.8M bytes
17,965,056
17,965,056 # At this point, the original code was above 21.7M bytes
... remains unchanged until end of program if gc.collect() called regularly ...
我也尝试过:
Tk
也不起作用。
答案 0 :(得分:2)
.bulk_create
[Django-doc]将对象的列表存储到数据库中。 batch_size
用于确定每个查询 中数据库中存储了多少个对象。
例如,如果您有一个包含100个元素的列表,而batch_size=10
则将导致10个查询,如果batch_size=25
则将导致4个查询(假设查询时间不太长)。或按照文档中的说明:
此方法将提供的对象列表插入数据库 以高效的方式(通常只有1个查询,无论有多少个 有物体)。
因此batch_size
参数仅用于“限制”每个查询存储的元素数量,对于某些数据库系统,最好使用多个查询,例如仍可访问该表在进行大量插入时。
但是,在这里,您仅给该函数一个一个元素的列表,因此无论batch_size
,您都可以创建一个包含20个ModelT
的列表:< / p>
objs1 = [
ModelT(name=instance.name, author=instance.author, content=instance.content)
for _ in range(20)
]
ModelT.objects.bulk_create(objs1)
如果所有对象具有相同的内容,我们甚至可以乘以一个数字:
objs1 = [
ModelT(name=instance.name, author=instance.author, content=instance.content)
] * 20
ModelT.objects.bulk_create(objs1)
请注意,如文档中所述,不会触发pre_save
和post_save
信号,并且除非数据库后端是PostgreSQL,否则对象的id
不是 设置(对于后一种方法,它将不起作用,因为在这里我们构造了一个列表,其中包含对 same 对象的20个引用)。
您仍可以在上面指定的语义下指定batch_size
,但这不会使功能有所不同。