【发布时间】:2012-03-13 04:59:36
【问题描述】:
我目前正在使用 pyodbc 从数据库中选择大量行。然后将结果复制到一个大列表中,然后我尝试遍历该列表。在我放弃 python 并尝试在 C# 中创建它之前,我想知道我是否做错了什么。
clientItems.execute("Select ids from largetable where year =?", year);
allIDRows = clientItemsCursor.fetchall() #takes maybe 8 seconds.
for clientItemrow in allIDRows:
aID = str(clientItemRow[0])
# Do something with str -- Removed because I was trying to determine what was slow
count = count+1
更多信息:
- for 循环目前以每秒 5 次左右的速度运行,这对我来说似乎非常慢。
- 选择的总行数约为 489,000。
- 运行它的机器有很多 RAM 和 CPU。它似乎只运行一两个核心,ram 是 1.72GB 的 4gb。
谁能告诉我怎么了?脚本运行这么慢吗?
谢谢
【问题讨论】:
-
clientItemRow[0]真的很大吗? 489,000 是一个低行数,但 5rows/s 慢得可笑。另外,如果我错了,有人可以纠正我,但我很确定你写的代码只能在一个核心上运行,但仍然应该比每秒 5 次迭代快几英里。此外,您可以使用内置的 cProfile 查看您遇到瓶颈的位置。 -
至于 CPU 使用率——如果你正在对检索到的结果做一些花哨的事情,你可以通过使用 Python 的多处理模块来获得更多的 cpu 内核——但让我们先解决这个问题。
-
type(allIDRows)返回什么? -
@prelic:我怀疑 odbc 驱动程序“fetchall”返回的 watherver 对象存在严重问题 - 唯一可能如此缓慢的方法是迭代它是 O(N) 或更糟。
标签: python sql database pyodbc