我有一个包含大约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
格式。
答案 0 :(得分:3)
如果您使用支持率较高的psycopg2
扩展程序,则可以使用客户端游标上的循环或fetchone
,一次只获取一行,psycopg2
使用服务器端门户来支持其光标。
如果py-postgresql不支持类似的内容,您可以始终明确DECLARE
a cursor on the database side和FETCH
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时间戳。