0

我有一个包含大约 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 时间戳,我打算在将它们%Y-%m-%d添加到列表之前将它们转换为格式uniqueue_days

4

2 回答 2

3

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

如果 py-postgresql 不支持类似的东西,你总是可以显式地DECLARE在数据库端显示一个游标,FETCH从它的行中渐进式。我在文档中没有看到任何表明 py-postgresql 可以像在协议级别自动为您执行此操作的内容psycopg2

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

于 2014-02-05T11:21:20.880 回答
1

您可以让数据库完成所有繁重的工作。例如:与其将所有数据读入Python然后计算unique_dates为什么不尝试这样的事情

SELECT DISTINCT DATE(to_timestamp(time)) AS UNIQUE_DATES FROM mytable;

如果您想严格执行sort order返回的 unique_dates,请执行以下操作:

SELECT DISTINCT DATE(to_timestamp(time)) AS UNIQUE_DATES 
FROM mytable
order by 1;

上面使用的函数的有用参考:

日期/时间函数和运算符

数据类型格式化函数

如果您想分块读取数据,您可以使用从上述查询中获得的日期来进一步细分您的结果:

前任:

'SELECT *  FROM mytable mytable where time between' +UNIQUE_DATES[i] +'and'+ UNIQUE_DATES[j]   ;

其中 UNIQUE_DATES[i]& [j] 将是您将从 Python 传递的参数。

我将留给您计算如何转换date为 unix 时间戳。

于 2014-02-05T09:42:14.560 回答