内存有效的获取postgresql uniqueue日期的方法?

时间:2014-02-05 09:10:27

标签: 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时间戳,我打算在将它们添加到%Y-%m-%d列表之前将它们转换为uniqueue_days格式。

2 个答案:

答案 0 :(得分:3)

如果您使用支持率较高的psycopg2扩展程序,则可以使用客户端游标上的循环或fetchone,一次只获取一行,psycopg2使用服务器端门户来支持其光标。

如果py-postgresql不支持类似的内容,您可以始终明确DECLARE a cursor on the database sideFETCH rows from it progressively。我没有在文档中看到任何建议py-postgresql可以在psycopg2这样的协议级别自动为您执行此操作。

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

答案 1 :(得分:1)

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

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

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

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

上面使用的函数的有用引用:

Date/Time Functions and Operators

Data Type Formatting Functions

如果您想要以块的形式阅读数据,您可以使用从上面的查询中获得的日期来进一步对结果进行分组:

例如:

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

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

我将留待您了解如何将date转换为unix时间戳。