我有一个返回很多行的查询,每行都很大,因为我需要提取BLOB
。
我按如下方式进行查询:
import pymysql
db = pymysql.connect(...)
with db.cursor() as cur:
cur.execute("select value from my_blobs")
for row in cur:
...
我天真地期望迭代cur
而不是调用fetchall()
,会避免一次获取所有数据并在此过程中耗尽内存。但是,我看到的是,在调用cur.execute()
期间内存耗尽,也就是说,在我尝试通过fetchall()
,fetchone()
或迭代{{1}之前获取结果之前}}
我的问题是,如何逐一获取我的斑点?我是否必须在应用程序中进行迭代并为每个blob创建一个新查询?那么,如果在cur
期间查询整个数据,fetchone
或迭代cur
会有什么用?
答案 0 :(得分:1)
默认光标类是缓冲数据。幸运的是,有无缓冲版本:pymysql.cursors.SSCursor
。尝试运行db.cursor(pymysql.cursors.SSCursor)
而不是db.cursor()
。
Unbuffered Cursor,主要用于返回大量数据的查询,或用于通过慢速网络连接到远程服务器。
不是将每行数据复制到缓冲区中,而是根据需要获取行。这样做的好处是客户端使用的内存要少得多,并且在慢速网络上传输或者结果集非常大时返回行的速度要快得多。