0

我正在使用pg8000带有 Python 3 的包来查询表,并注意到应用程序的内存消耗随着表的记录数的增长而增长,现在已达到超过 16GB 的内存消耗。

在检查包的游标行为时,我发现游标在被 any或方法出队之前pg8000将整个结果集缓存到属性下的内存队列中。curr._cached_rows.fetchone().fetchmany(n).fetchall()

在我的特定情况下,我通过在 Glue 作业上使用 Python shell 来提取 AWS Redshift 上的记录,该作业带有 2 个限制:

  1. 不支持基于 Python 的 C 包(psycopg不幸的是,不支持服务器端游标的缓存)
  2. 最大 16GB 内存。

我浏览了pg8000文档,但找不到任何关于设置服务器端光标的参考。无论如何设置服务器端光标pg8000?或者是否有任何其他支持服务器端光标的 postgres/redshift 纯 Python 包?

4

1 回答 1

1

pg8000 文档现在有一个服务器端游标示例:

>>> import pg8000.native
>>>
>>> con = pg8000.native.Connection(username, password="cpsnow")
>>> con.run("START TRANSACTION")
[]
>>> con.run("DECLARE c SCROLL CURSOR FOR SELECT * FROM generate_series(1, 100)")
[]
>>> con.run("FETCH FORWARD 5 FROM c")
[[1], [2], [3], [4], [5]]
>>> con.run("MOVE FORWARD 50 FROM c")
[]
>>> con.run("FETCH BACKWARD 10 FROM c")
[[54], [53], [52], [51], [50], [49], [48], [47], [46], [45]]
>>> con.run("CLOSE c")
[]
>>> con.run("ROLLBACK")
[]
于 2021-04-04T09:58:44.590 回答