2024-09-28 17:30:31 发布
网友
在做了一些研究之后,我发现python中使用psycopg2的无名游标会尝试将所有结果集加载到我的计算机内存中,这对我来说是个大问题,因为我查询的Postgresql表的大小约为1.4tb。我发现给我的游标起一个名字会创建一个服务器端游标,它只会使用'fetchmany'加载我要请求它的行数,但是执行查询的速度明显变慢了。有没有办法让我加快服务器端光标的速度? *我尝试只加载大约2000行,因为这大约是我需要的批处理的大小。在
我不是100%肯定这是否能解决您的性能问题,但是您不需要将cursor.fetchmany()与服务器端游标一起使用。您可以在命名的游标上迭代。在
cursor.fetchmany()
with psycopg2.connect(db_uri_string) as conn: cursor = conn.cursor(name='cursor_name') cursor.itersize = 20000 query = "SELECT * FROM ..." cursor.execute(query) for row in cursor: # process row
而且,itersize越低,进行的网络调用就越多,这可能会降低性能,尤其是对于如此大的数据集和如此低的itersize。如果需要成批处理2000行,可以增加itersize,并在每个fetchmany中执行2000行,例如fetchmany(2000)。fetchmany在遍历所有当前获取的行之前不会进行网络调用。在
fetchmany(2000)
如果itersize为20000,并且您调用fetchmany(2000),则需要10fetchmany(2000)来进行网络调用。在
我不是100%肯定这是否能解决您的性能问题,但是您不需要将
cursor.fetchmany()
与服务器端游标一起使用。您可以在命名的游标上迭代。在而且,itersize越低,进行的网络调用就越多,这可能会降低性能,尤其是对于如此大的数据集和如此低的itersize。如果需要成批处理2000行,可以增加itersize,并在每个fetchmany中执行2000行,例如
fetchmany(2000)
。fetchmany在遍历所有当前获取的行之前不会进行网络调用。在如果itersize为20000,并且您调用
fetchmany(2000)
,则需要10fetchmany(2000)
来进行网络调用。在相关问题 更多 >
编程相关推荐