python – postgresql:出共享内存?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – postgresql:出共享内存?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4443字,纯文字阅读大概需要7分钟。
内容图文
![python – postgresql:出共享内存?](/upload/InfoBanner/zyjiaocheng/911/570d806eedb646ab9f22e6ad61339054.jpg)
我正在使用Python和psycopg2运行一堆查询.我创建了一个大约200万行的大型临时表,然后通过使用cur.fetchmany(1000)从中获取1000行,并运行涉及这些行的更广泛的查询.广泛的查询是自给自足的 – 一旦完成,我不再需要他们的结果,当我继续下一个1000.
但是,大约1000000行,我从psycopg2得到一个异常:
psycopg2.OperationalError: out of shared memory
HINT: You might need to increase max_locks_per_transaction.
有趣的是,当我执行查询以删除一些更广泛的查询创建的临时表时,就会发生这种情况.
为什么会这样?有什么办法可以避免吗?令人讨厌的是,这发生在中途,这意味着我必须再次运行它. max_locks_per_transaction可能与任何事情有什么关系?
注意:我没有做任何.commit(),但是我正在删除我创建的所有临时表,而且我只是为每个“广泛”事务触摸相同的5个表,所以我看不到如何耗尽表锁可能是问题…
解决方法:
当您创建一个表时,您将获得一个持续到事务结束的独占锁.即使你然后继续放弃它.
所以如果我启动一个tx并创建一个临时表:
steve@steve@[local] *=# create temp table foo(foo_id int);
CREATE TABLE
steve@steve@[local] *=# select * from pg_locks where pid = pg_backend_pid();
locktype | database | relation | page | tuple | virtualxid | transactionid | classid | objid | objsubid | virtualtransaction | pid | mode | granted
---------------+----------+-----------+------+-------+------------+---------------+---------+-----------+----------+--------------------+-------+---------------------+---------
virtualxid | | | | | 2/105315 | | | | | 2/105315 | 19098 | ExclusiveLock | t
transactionid | | | | | | 291788 | | | | 2/105315 | 19098 | ExclusiveLock | t
relation | 17631 | 10985 | | | | | | | | 2/105315 | 19098 | AccessShareLock | t
relation | 17631 | 214780901 | | | | | | | | 2/105315 | 19098 | AccessExclusiveLock | t
object | 17631 | | | | | | 2615 | 124616403 | 0 | 2/105315 | 19098 | AccessExclusiveLock | t
object | 0 | | | | | | 1260 | 16384 | 0 | 2/105315 | 19098 | AccessShareLock | t
(6 rows)
删除表时,不会删除这些“关系”锁:
steve@steve@[local] *=# drop table foo;
DROP TABLE
steve@steve@[local] *=# select * from pg_locks where pid = pg_backend_pid();
locktype | database | relation | page | tuple | virtualxid | transactionid | classid | objid | objsubid | virtualtransaction | pid | mode | granted
---------------+----------+-----------+------+-------+------------+---------------+---------+-----------+----------+--------------------+-------+---------------------+---------
virtualxid | | | | | 2/105315 | | | | | 2/105315 | 19098 | ExclusiveLock | t
object | 17631 | | | | | | 1247 | 214780902 | 0 | 2/105315 | 19098 | AccessExclusiveLock | t
transactionid | | | | | | 291788 | | | | 2/105315 | 19098 | ExclusiveLock | t
relation | 17631 | 10985 | | | | | | | | 2/105315 | 19098 | AccessShareLock | t
relation | 17631 | 214780901 | | | | | | | | 2/105315 | 19098 | AccessExclusiveLock | t
object | 17631 | | | | | | 2615 | 124616403 | 0 | 2/105315 | 19098 | AccessExclusiveLock | t
object | 17631 | | | | | | 1247 | 214780903 | 0 | 2/105315 | 19098 | AccessExclusiveLock | t
object | 0 | | | | | | 1260 | 16384 | 0 | 2/105315 | 19098 | AccessShareLock | t
(8 rows)
事实上,它增加了两个锁…似乎我不断创建/删除该临时表,每次增加3个锁.
所以我想一个答案是你需要足够的锁来应对在整个事务中添加/删除的所有这些表.或者,您可以尝试在查询之间重用临时表,只需截断它们以删除所有临时数据?
内容总结
以上是互联网集市为您收集整理的python – postgresql:出共享内存?全部内容,希望文章能够帮你解决python – postgresql:出共享内存?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。