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

Python 获取postgresql单队列日期的高效内存方法?,python,postgresql,memory-management,python-3.x,py-postgresql,Python,Postgresql,Memory Management,Python 3.x,Py Postgresql,我有一个数据库,大约有3000万个条目,这是一个很大的数目,我只希望在处理较大的数据库条目时遇到麻烦 但是使用py-postgresql和.prepare()语句,我希望我能够在“收益率”的基础上获取条目,从而避免仅用数据库中的结果来填满我的内存,而这是我无法做到的 到目前为止,我得到的是: import postgresql user = 'test' passwd = 'test db = postgresql.open('pq://'+user+':'+passwd+'@192.168.1

我有一个数据库,大约有3000万个条目,这是一个很大的数目,我只希望在处理较大的数据库条目时遇到麻烦

但是使用py-postgresql和
.prepare()
语句,我希望我能够在“
收益率
”的基础上获取条目,从而避免仅用数据库中的结果来填满我的内存,而这是我无法做到的

到目前为止,我得到的是:

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)
甚至在uniqueue天内到达
if not row['time']之前:
我的内存不足,考虑到
result()
可能在循环之前获取所有结果,这并不奇怪? 有没有办法让库
postgresql
以每轮60k的速度“翻页”或批处理结果,或者甚至重新修改查询以完成更多工作

提前谢谢


编辑:应该提到数据库中的日期是Unix时间戳,我打算将它们转换为
%Y-%m-%d
格式,然后再将它们添加到
uniqueue\u days
列表中。

您可以让数据库完成所有繁重的工作。 例:与其将所有数据读入
Python
,然后计算
unique\u日期
为什么不试试这样的方法呢

SELECT DISTINCT DATE(to_timestamp(time)) AS UNIQUE_DATES FROM mytable;
如果要在返回的唯一日期上严格执行排序顺序,请执行以下操作:

SELECT DISTINCT DATE(to_timestamp(time)) AS UNIQUE_DATES 
FROM mytable
order by 1;
上述函数的有用参考:

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

例:

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


我将留给您考虑如何将
日期
转换为unix时间戳。

您可以让数据库完成所有繁重的工作。 例:与其将所有数据读入
Python
,然后计算
unique\u日期
为什么不试试这样的方法呢

SELECT DISTINCT DATE(to_timestamp(time)) AS UNIQUE_DATES FROM mytable;
如果要在返回的唯一日期上严格执行排序顺序,请执行以下操作:

SELECT DISTINCT DATE(to_timestamp(time)) AS UNIQUE_DATES 
FROM mytable
order by 1;
上述函数的有用参考:

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

例:

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


我将留给您来考虑如何将
date
转换为unix时间戳。

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

如果py-postgresql不支持类似的东西,那么您可以始终显式地使用它。我在文档中没有看到任何东西表明py-postgresql可以像
psycopg2
那样在协议级别自动为您执行此操作


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

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

如果py-postgresql不支持类似的东西,那么您可以始终显式地使用它。我在文档中没有看到任何东西表明py-postgresql可以像
psycopg2
那样在协议级别自动为您执行此操作


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

谢谢,第一个例子直接给出了我需要的结果。第二个问题我已经想到了,但希望有更好的解决办法。花了一分钟时间在postgresql内部计算结果,这比我希望的要好得多。谢谢你!如果你有数百万行,如果你要使用那个字段来对你的数据进行子集,你可能想考虑添加一个索引:“代码>时间>代码>字段。我已经考虑过了,但是PostgreSQL如何索引事物以及如何设置它有点新,但是它是在我的待办事项列表中,以确保加速操作。谢谢,第一个例子直接给出了我需要的结果。第二个问题我已经想到了,但希望有更好的解决办法。花了一分钟时间在postgresql内部计算结果,这比我希望的要好得多。谢谢你!如果你有数百万行,如果你要使用那个字段来对你的数据进行子集,你可能想考虑添加一个索引:“代码>时间>代码>字段。我已经考虑过了,但是PostgreSQL如何索引事物以及如何设置它有点新,但是它是在我的待办事项列表中,以确保加速操作。我会考虑改变数据库,当然,如果它有优势(根据它的声音,可能有的话)。然而,这将是未来的道路,因为在这个特定项目的时间问题。但我只想对你的回答表示感谢,因为它很有帮助,会被使用的!我会考虑改变数据库,当然,如果它有优势(根据它的声音,可能有的话)。然而,这将是未来的道路,因为在这个特定项目的时间问题。但我只想对你的回答表示感谢,因为它很有帮助,会被使用的!