我有一个查询,该查询返回许多行,由于存在需要提取的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/

10-12 07:21