我有一张大约有20万张唱片的桌子。我正在尝试用炼金术批量插入大约20条记录。通常大约需要20毫秒,但当我在插入之前加载表中的所有记录时,大约需要1000毫秒(慢50倍)。为什么?
from models import LocationMap, db
import random
import time
# the last line 'db.session.commit()' will be extremely slow when I uncomment this line.
#known_locations = LocationMap.query.all()
for i in range(10):
loc = LocationMap()
loc.longitude = 0 #location_batch[i + j][0]
loc.latitude = random.random() #location_batch[i + j][1]
loc.country = 'test'
loc.province = 'test2'
loc.city = 'test3'
loc.district = 'test4'
loc.township = 'test5'
db.session.add(loc)
st = time.time()
db.session.commit()
print(time.time() - st)
我认为这与实例、引用、身份映射等的跟踪/状态有关。换句话说,我认为原因主要是
ORM
的工作有多相似(sqlalchemy
不是很小ORM
)。这就是为什么这些类型的工具在处理大型数据集时性能较差的原因。但是它们有非常强大的功能我将试着用一个例子来解释:
会发生什么?是的,我们不仅有插页。我们还将有2个更新(
new value1
,new value2
)。因为Session
具有对所有对象的引用。现在,让我们尝试从Session
中删除所选实例:您将看到该操作需要约20毫秒(正常时间)。您还可以从
Session
中删除特定对象:否则,如果性能对您至关重要,您可以对
ORM
说不相关问题 更多 >
编程相关推荐