我有一个查询,该查询返回许多行,由于存在需要提取的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()
或通过遍历cur
获得结果之前。我的问题是,我怎样才能一滴一滴地获得斑点?我是否必须在应用程序中进行迭代并对每个Blob进行新查询?那么,如果在
fetchone
期间查询整个数据,则cur
或在execute()
上进行迭代有什么用? 最佳答案
默认游标类正在缓冲数据。幸运的是,存在无缓冲版本:pymysql.cursors.SSCursor
。尝试运行db.cursor(pymysql.cursors.SSCursor)
而不是db.cursor()
。
从API reference for SSCursor
:
无缓冲游标,主要用于返回大量数据的查询或通过慢速网络连接到远程服务器。
与其将每行数据复制到缓冲区中,不如将其按需获取行。这样做的好处是客户端使用的内存少得多,并且当通过慢速网络或结果集很大时,返回行的速度要快得多。
关于python - 使用pymysql从服务器一一读取行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48405752/