psycopg2 使用太多内存

问题描述 投票:0回答:2

我有一个非常大的表(3.7 GB)存储在 PostgreSQL 数据库中,我使用 psycopg2 加载该表,代码如下:

conn = psycopg2.connect(host="localhost", port = 5432, database="postgres", user="postgres", password="root")

cur = conn.cursor('cursor1')
cur.itersize = 10000 
cur.execute("""SELECT * FROM customers""")
query_results = cur.fetchall()
cur.close()
conn.close()

Python 第一次使用 13GB 内存加载表,每次再次运行此代码时,内存使用量都会增加,直到达到 99%;然后再次下降到13GB水平。此外,每次查询需要更长的时间来执行:第一次 34 秒,第二次 46 秒,并且在下一次运行中保持在大约 45 秒左右。

我已经寻找了一个解决方案,并且这个答案似乎提供了答案,但是添加itersize对我来说也不起作用;内存使用量保持不变

我应该怎样做才能减少内存使用?我使用了 gc.collect() 但它也不起作用。

我在 Windows10 机器上使用 Python 3.9 和 PostgreSQL 14,并且我有 32GB RAM。

python postgresql psycopg2
2个回答
0
投票

以 pythonic 形式保存数据的大约 4 倍扩展似乎是正确的(使用 pgbench_accounts 作为基准)。 Python 自动管理内存,但效率并不高。 如果你想对大脑的内存使用情况进行微观管理,你应该用 C 语言编写,而不是 Python。

当您希望将数据全部存储在内存中时,使用命名游标来读取数据几乎毫无意义。 现在,如果您想通过 python 流式传输数据,就像使用

for row in cur
一样,那么这本身就可以节省大量内存,并且在其之上使用命名游标可以节省更多。

您关于每次运行时使用越来越多内存的评论没有任何意义。 您的代码仅执行 SQL 一次。 您不能指望对代码中不可见的部分进行智能注释。


0
投票

我遇到了同样的问题,即使使用光标的命名和每行的迭代也无法解决它。

从 psycopg2 升级到 psycopg3 解决了我的问题。

© www.soinside.com 2019 - 2024. All rights reserved.