获取postgresql单队列日期的内存高效方法?

2024-10-01 02:36:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个大约有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:之前,我的内存已经用完了,考虑到{}可能在循环之前获取所有结果,这并不奇怪吗? 有没有一种方法可以让库postgresql进入“页面”,或者批量处理结果,比如每轮60k,或者甚至可以重新处理查询来完成更多的工作?在

提前谢谢!在

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


Tags: 内存intest数据库dbiftimepostgresql
2条回答

你可以让数据库承担所有的重担。 例如:与其把所有数据读入Python然后计算unique_dates,为什么不试试这样的方法呢

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

如果要对返回的唯一日期严格执行sort order,请执行以下操作:

^{pr2}$

以上所用函数的参考:

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时间戳。在

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

如果py postgresql不支持类似的东西,您可以始终显式地^{} a cursor on the database side和{a2}。我在文档中没有看到任何东西表明py postgresql可以像psycopg2那样在协议级别自动为您完成这项工作。在

通常,您可以很容易地在数据库驱动程序之间切换,但是py-postgresql似乎没有遵循pythondb-API,因此测试它还需要进行一些更改。我还是推荐它。在

相关问题 更多 >