pymysql流式遊標

Python通過pymysql操作向mysql讀取千萬、百萬級別的數據庫時

如果用傳統的fetchall()fetchone()方法,都是先默認在內存裏緩存下所有行然後再處理,大量的數據會導致內存資源消耗光,內存容易溢出

此時則建議使用SSCursor(流式遊標),避免客戶端佔用大量內存

這個 cursor 實際上沒有緩存下來任何數據,它不會讀取所有所有到內存中,它的做法是從儲存塊中讀取記錄,並且一條一條返回給你,使用迭代器而不用 fetchall ,即省內存又能很快拿到數據

例:

def select_pan_url(self):
    db = pymysql.connect(host='localhost', port=3306, user='root', passwd='', db='')
    cursor = db.cursor(cursor=pymysql.cursors.SSDictCursor)

    select_sql = "select `name`, `detail_url`, `pan_title`, `pan_psw`, `pan_real_url` from agepan_wj"
    try:
        cursor.execute(select_sql)
        # 在處理大量數據時可以分割進行
        datas = cursor.fetchall()
        for pan in datas:
            self.row_lists.append(pan)
    except Exception as e:
        print('取數據失敗', e)
        db.rollback()
    finally:
        cursor.close()
        db.close()

需要注意的是:

因爲SSCursor是沒有緩存的遊標,結果集只要沒取完,這個connect是不能再處理別的sql,包括另外生成一個cursor 也不行的,如果需要幹別的,請另外再生成一個連接對象

每次讀取後處理數據要快,不能超過 60 s,否則mysql將會斷開這次連接

也可以修改SET NET_WRITE_TIMEOUT = xx來增加超時間隔

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章