python - 获取 postgresql 唯一日期的内存有效方式?

标签 python postgresql memory-management python-3.x py-postgresql

我有一个包含大约 3000 万个条目的数据库,这已经很多了,我预计除了处理更大的数据库条目会遇到麻烦外,别无他法。

但是使用 py-postgresql 和 .prepare() 语句我希望我可以在“yield”的基础上获取条目,从而避免用只有数据库的结果,我显然不能?

这是我到目前为止所得到的:

import postgresql
user = 'test'
passwd = 'test
db = postgresql.open('pq://'+user+':'+passwd+'@192.168.1.1/mydb')
results = db.prepare("SELECT time time FROM mytable")
uniqueue_days = []
with db.xact():
    for row in result():
        if not row['time'] in uniqueue_days:
            uniqueue_days.append(row['time'])

print(uniqueue_days)

甚至在到达 if not row['time'] in uniqueue_days: 之前,我的内存就用完了,考虑到 result() 可能会获取,这并不奇怪循环之前的所有结果? 有没有办法让 postgresql 库“分页”或将结果分批处理,例如每轮 60k,或者甚至可能重新处理查询以完成更多工作?

提前致谢!

编辑:应该提到数据库中的日期是 Unix 时间戳,我打算在将它们添加到 uniqueue_days< 之前将它们转换为 %Y-%m-%d 格式 列表。

最佳答案

如果您使用支持更好的 psycopg2 扩展,您可以在客户端游标或 fetchone 上使用循环,一次只获取一行,因为 psycopg2 使用服务器端门户来支持其光标。

如果 py-postgresql 不支持类似的东西,你总是可以明确地 DECLARE a cursor on the database sideFETCH rows from it progressively .我在文档中没有看到任何内容表明 py-postgresql 可以像 psycopg2 那样在协议(protocol)级别自动为您执行此操作。

通常您可以很容易地在数据库驱动程序之间切换,但是 py-postgresql 似乎不遵循 Python DB-API,因此测试它需要更多更改。我仍然推荐它。

关于python - 获取 postgresql 唯一日期的内存有效方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21572844/

相关文章:

python - 仅当找到的正则表达式匹配项在 Python 中的空格之间时才打印行

java - 有没有办法获取正在运行的数据库的名称?

ruby-on-rails - 数据库锁在 Rails 和 Postgres 中无法正常工作

c - 使用 libjpeg 读取图像像素数据的 3 维数组的内存分配

在 C 中复制分配的结构

c - 在 C 中使用 malloc() 初始化大型数组时出现段错误

Python非滚动控制台输出

python - 打包多个Python文件: Getting Import error

python - 每次迭代后处理时间越来越长(TensorFlow)

sql - Postgres : Why did adding index slow down regexp queries?