我有一个包含大约 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 side和 FETCH
rows from it progressively .我在文档中没有看到任何内容表明 py-postgresql 可以像 psycopg2
那样在协议(protocol)级别自动为您执行此操作。
通常您可以很容易地在数据库驱动程序之间切换,但是 py-postgresql
似乎不遵循 Python DB-API,因此测试它需要更多更改。我仍然推荐它。
关于python - 获取 postgresql 唯一日期的内存有效方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21572844/