作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我用 python
编写了一个脚本,它使用 psycopg
连接到数据库。我正在处理同一个数据库中的两个表。首先,我运行 select * from table_1
,然后检查每一行 (fetchone
) 是否满足某些要求。如果他们这样做,将在 table_2 中创建一个新行,其中包含 INSERT
。代码看起来类似于:
cursor_1 = conn.cursor()
cursor_2 = conn.cursor()
cursor_1.execute("SELECT * FROM table_1")
for i in range(1,n):
a = cursor_1.fetchone()
if (condition_in_a):
cursor_2.execute("INSERT into table_2 (f1,f2) values (v1,v2)")
该脚本在顺序 for
循环中运行,我想知道在性能方面是否有更好的方法通过 psycopg2.pool
完成此任务。所以我的问题是:是否可以对 psycopg
游标进行多线程处理?如果不是,实现更好性能的最佳方法是什么?
提前致谢。
最佳答案
在单线程方法中,您试图在内存使用和行处理速度之间保持平衡。 fetchone
减少内存使用,但需要更多工作来获取数据。大型数据集的 fetchall
使用大量内存,数据加载可能需要一些时间才能开始处理。
因此,至少,更好的方法是使用 fetchmany
获取较小部分的数据。下面的生成器可以简化一个过程:
def ResultIter(cursor, limit=100):
while True:
results = cursor.fetchmany(limit)
if not results:
break
for result in results:
yield result
基于这种方法你也可以实现多线程处理,但我真的不确定性能。
关于python - 在 psycopg2 中的游标内线程化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47802139/
我是一名优秀的程序员,十分优秀!