91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

分析PyMySQL獲取一條數據會讓內存爆炸的原因

發布時間:2021-11-05 13:55:50 來源:億速云 閱讀:219 作者:iii 欄目:web開發

這篇文章主要講解了“分析PyMySQL獲取一條數據會讓內存爆炸的原因”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“分析PyMySQL獲取一條數據會讓內存爆炸的原因”吧!

當Python 有讀寫 MySQL 數據的需求時,我們經常使用PyMySQL這個第三方庫來完成。

有時候如果一張表里面的數據非常大,但是我們只需要讀取一條數據,此時我們可能會想當然地使用cursor.fetchone()這個方法,以為這樣就真的可以只讀取一條數據:

import pymysql   connection = pymysql.connect(host='localhost',                              user='user',                              password='passwd',                              db='db',                              charset='utf8mb4',                              cursorclass=pymysql.cursors.DictCursor)                               with connection.cursor() as cursor:     db = 'select * from users where age > 10'     cursor.execute(db)     one_user = cursor.fetchone()

但實際上,上面這段代碼,與下面這段代碼沒有任何區別:

... with connection.cursor() as cursor:     sql = 'select * from users where age > 10'     cursor.execute(sql)     all_users = cursor.fetchall()     one_user = all_users[0]

這是因為,當我們執行到cursor.execute(sql)的時候,PyMySQL就已經把表里面所有的數據讀取到內存中了。而后面的cursor.fetchall()或者cursor.fetchone()只不過是從內存中返回全部數據還是返回1條數據而已。

我們來看PyMySQL的源代碼[1]。在cursor.execute()方法代碼如下圖所示:

分析PyMySQL獲取一條數據會讓內存爆炸的原因

其中第163行調用了self._query方法。我們再去到這個方法里面:

分析PyMySQL獲取一條數據會讓內存爆炸的原因

看到代碼第322行,調用了self._do_get_result()方法。我們再去這個方法里面看看:

分析PyMySQL獲取一條數據會讓內存爆炸的原因

注意代碼第342行,此時已經把所有數據存放到了self._rows列表中。

現在我們來看cursor.fetchone()方法:

分析PyMySQL獲取一條數據會讓內存爆炸的原因

可以看到,這里不過是從列表里面根據下標讀取一條數據出來而已。

再看cursor.fetchall()方法:

分析PyMySQL獲取一條數據會讓內存爆炸的原因

如果之前先多次調用過cursor.fetchone(),那么self.rownumber會持續增加。而調用cursor.fetchall()時,跳過之前已經返回過的數據,直接返回剩下的全部數據即可。如果之前沒有調用過cursor.fetchone(),那么直接返回全部數據。

所以,單純使用cursor.fetchone()并不能節省內存,如果表里面的數據非常大,還是會有內存爆炸的危險。

那么真正的解決辦法是什么呢?真正的解決辦法在創建數據庫連接的時候指定游標類型。pymysql.connect有一個參數叫做cursorclass,把它的值設定為pymysql.SSDictCursor即可解決問題。

我們來看一下如何正確使用它:

import pymysql   connection = pymysql.connect(host='localhost',                              user='user',                              password='passwd',                              db='db',                              charset='utf8mb4',                              cursorclass=pymysql.cursors.SSDictCursor)                               with connection.cursor() as cursor:     db = 'select * from users where age > 10'     cursor.execute(db)     for row in cursor:         print('對 cursor 直接進行迭代,每循環一次,從數據庫讀取一條數據。不會提前把所有數據讀取到內存中。')         print(row['name'])

感謝各位的閱讀,以上就是“分析PyMySQL獲取一條數據會讓內存爆炸的原因”的內容了,經過本文的學習后,相信大家對分析PyMySQL獲取一條數據會讓內存爆炸的原因這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

龙泉市| 岢岚县| 晋州市| 门头沟区| 弥勒县| 钟祥市| 彭阳县| 西峡县| 鄂伦春自治旗| 毕节市| 剑川县| 惠安县| 咸宁市| 牙克石市| 大同市| 彭水| 凌云县| 通化县| 河间市| 安仁县| 绩溪县| 班玛县| 镇平县| 洛川县| 弋阳县| 沙田区| 胶州市| 嘉义市| 旬邑县| 兰西县| 济宁市| 海晏县| 屯门区| 周至县| 通渭县| 屏边| 二手房| 滕州市| 来安县| 耒阳市| 饶河县|