我有一个大约有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
格式。在
你可以让数据库承担所有的重担。 例如:与其把所有数据读入
Python
然后计算unique_dates
,为什么不试试这样的方法呢如果要对返回的唯一日期严格执行
^{pr2}$sort order
,请执行以下操作:以上所用函数的参考:
Date/Time Functions and Operators
Data Type Formatting Functions
如果您想分块读取数据,您可以使用从上面的查询中获得的日期将结果进一步细化:
例如:
其中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,因此测试它还需要进行一些更改。我还是推荐它。在相关问题 更多 >
编程相关推荐