我在python
编写了一个脚本,使用psycopg
连接到数据库。
我在同一个数据库中使用两个表。首先我运行select * from table_1
然后检查每行(fetchone
)是否满足某些要求。如果是,则使用INSERT
创建table_2中的新行。代码看起来类似于:
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
光标?如果不是,那么实现更好性能的最佳方法是什么?
提前致谢。
答案 0 :(得分:1)
在单线程方法中,您试图在内存使用和行处理速度之间保持平衡。 fetchone
减少了内存使用量,但需要更多工作才能获取数据。对于大型数据集,fetchall
使用大量内存,并且在处理开始之前数据加载可能需要一些时间。
所以,至少,更好的方法是使用fetchmany
按较小的部分获取数据。以下生成器可以简化过程:
def ResultIter(cursor, limit=100):
while True:
results = cursor.fetchmany(limit)
if not results:
break
for result in results:
yield result
基于这种方法,您也可以实现多线程处理,但我真的不确定性能。