`
tcspecial
  • 浏览: 896214 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

mysqldb查询大量数据

阅读更多

 

最近线上遇到一个问题,python定时任务运行到一半时就因为OOM被kill退出。

程序主要是利用MySQLdb插件导出db流水数据,流水数据比较大,有430w条记录,因此分多次加载数据。

db = MySQLdb.connect(host, user, pwd, db, port)
curs = db.cursor()

# 由于数据较大,不能通过fetchall()一次性读取
rec = curs.fetchone()
while rec:
	print rec
	rec = curs.fetchone()

  

但是做了上述优化后,脚本仍然会因为OOM被kill。gdb调试发现程序在不停的读数据,不是应该通过cursor每次一条条读取吗?

MySQLdb提供了四种游标:

  • Cursor/DictCursor  默认Cursor,将结果存储成Tuple; 两者都是将数据缓存到Client侧,然后从内存中fetch。
  • SSCursor/SSDictCursor 实现在Server端存储数据,fetchone()时从服务端获取一条记录。

 

db = MySQLdb.connect(host, user, pwd, db, port, 
	            cursorclass=MySQLdb.cursors.SSCursor)
curs = db.cursor()

 

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics