FlaskSqlAlchemy在加载大量数据后插入速度非常慢

2024-09-23 06:30:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一张大约有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)

Tags: importdbtimesessionbatch记录linelocation
1条回答
网友
1楼 · 发布于 2024-09-23 06:30:17

我认为这与实例、引用、身份映射等的跟踪/状态有关。换句话说,我认为原因主要是ORM的工作有多相似(sqlalchemy不是很小ORM)。这就是为什么这些类型的工具在处理大型数据集时性能较差的原因。但是它们有非常强大的功能

我将试着用一个例子来解释:

locations = LocationMap.query.all()
locations[0].country = 'new value1'
locations[1].country = 'new value2'
for i in range(10):
    # ... db.session.add(loc)

db.session.commit()

会发生什么?是的,我们不仅有插页。我们还将有2个更新(new value1new value2)。因为Session具有对所有对象的引用。现在,让我们尝试从Session中删除所选实例:

locations = LocationMap.query.all()
db.session.expunge_all()
# your code here... for i in range(10): 

您将看到该操作需要约20毫秒(正常时间)。您还可以从Session中删除特定对象:

locations = LocationMap.query.all()
for l in locations:
    # if we don't need reference anymore
    db.session.expunge(l)

否则,如果性能对您至关重要,您可以对ORM说不

相关问题 更多 >