【问题标题】:Executing a large query with psycopg2使用 psycopg2 执行大型查询
【发布时间】:2019-03-30 14:58:29
【问题描述】:

我正在尝试执行一个大型选择查询(大约 50 000 000 行,200 000 000 行,15 列)并使用 psycopg2 将所有这些数据提取到 pandas 数据框。在 pgadmin 服务器状态工具中,我可以看到,我的查询活跃了大约半小时,然后变得空闲。我读到这意味着服务器正在等待新命令。另一方面,我的 python 脚本仍然没有数据,它也在等待它们(没有错误,看起来数据正在下载)。

总结一下,数据库在等,python在等,我还要等吗?有幸福结局的机会吗?还是 python 无法处理大量的 od 数据?

【问题讨论】:

  • 您能解释一下为什么您认为需要将所有数据集加载到内存中吗?你可以改用一种算法来分块处理你的数据吗?
  • 这个问题更适合 codereview,在那里您可以就如何优化代码的(空间)性能提出建议,因为您的基本示例似乎工作正常(最多 700 万行) .

标签: python postgresql psycopg2


【解决方案1】:

天哪,蝙蝠侠!如果您的查询需要超过几分钟的时间来执行,您应该考虑一种不同的方式来处理您的数据!如果您返回 200 000 000 行 15 个单字节列,这已经是 3 GB 的原始数据,假设没有一个字节的开销,这是不太可能的。如果这些列是 64 位整数,则已经是 24 GB。 Python 需要处理大量内存中的数据。

您是否考虑过如果您的进程在执行过程中失败或连接中断会发生什么?如果您的流程可能,您的程序将受益于分块处理数据行。如果确实不可能,请考虑对数据库本身进行操作的方法,例如使用 PL/pgSQL。

【讨论】:

  • 起初我认为我最多可以有 1 000 000 行。那时内存没有问题,我决定在 python 中而不是在数据库中处理我的数据会更好,因为 python 有更多的功能。所以现在我已经准备好了代码,可以做我想做的一切,但前提是数据在内存中。即使我有 700 万行,它也可以工作,所以我认为我可以尝试所有数据(我知道这不明智,但我认为尝试 5000 万行没有害处)。分块处理真的是不可能的,但你说得对,这是很多数据,我会尝试找到不同的方法。谢谢罗宾!
  • 不客气。如果您发现此答案有用,请考虑投票和/或接受它!
猜你喜欢
  • 1970-01-01
  • 2018-10-24
  • 1970-01-01
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-16
  • 2018-02-11
  • 1970-01-01
相关资源
最近更新 更多