在psycopg2

时间:2017-12-13 21:08:40

标签: python postgresql psycopg2

我在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光标?如果不是,那么实现更好性能的最佳方法是什么?

提前致谢。

1 个答案:

答案 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

基于这种方法,您也可以实现多线程处理,但我真的不确定性能。