gpt4 book ai didi

python - Azure 数据库摄取速度

转载 作者:行者123 更新时间:2023-12-01 09:20:17 25 4
gpt4 key购买 nike

我正在尝试提高 Azure SQL 中的摄取速度。即使我使用 SQLAlchemy 连接池,在一定数量的线程之后速度根本没有增加,并且停留在每秒大约 700 次插入。

Azure SQL 显示资源利用率为 50%。该代码在 Azure 中运行,因此网络不应该成为问题。

有没有办法提高速度?

import pyodbc
from sqlalchemy.engine import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker

def connect():
return pyodbc.connect('....')

engine = create_engine('mssql+pyodbc://', creator=connect, pool_recycle=20, pool_size=128, pool_timeout=30)
session_factory = sessionmaker(bind=engine)


def process_entry(i):
session = scoped_session(session_factory)

# skipping logic for computing vec, name1, name2
# vec - list of floats, name1, name2 - strings
vec = [55.0, 33.2, 22.3, 44.5]
name1 = 'foo'
name2 = 'bar'

for j, score in enumerate(vec):
parms = {'name1': name1, 'name2': name2, 'score': score }
try:
session.execute('INSERT INTO sometbl (name1, name2, score) VALUES (:name1, :name2, :score)', parms)
session.commit()
except Exception as e:
print(e)



fs = []
pool = ThreadPoolExecutor(max_workers=128)

for i in range(0, N):
future = pool.submit(process_entry, i)
fs.append(future)

concurrent.futures.wait(fs, timeout=None, return_when=ALL_COMPLETED)

最佳答案

commit()每一行都会强制等待该行被保存到日志文件和可能的辅助副本中。相反,每 N 行提交一次。像这样的东西:

  rn = 0
for j, score in enumerate(vec):
parms = {'name1': name1, 'name2': name2, 'score': score }
try:
session.execute('INSERT INTO sometbl (name1, name2, score) VALUES (:name1, :name2, :score)', parms)
rn = rn + 1
if rn%100 == 0:
session.commit()
except Exception as e:
print(e)
session.commit()

如果您想更快地加载数据,您可以发送包含批量数据的 JSON 文档,并使用 OPENJSON 批量解析和插入它们。 SQL Server 中的函数。还有特殊的批量加载 API,但据我所知,这些 API 不容易从 python 访问。

您还可能以适度数量的工作线程达到最大吞吐量。除非你的 table 是 Memory Optimized您的插入可能需要协调对共享资源的访问,例如锁定 BTree 中的前导页,或二级索引中的行锁。

您当前拥有的高并发性可能只是(部分)补偿当前的每行提交策略。

关于python - Azure 数据库摄取速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50844401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com