1. 程式人生 > >python讀取幾千萬行的大表記憶體問題

python讀取幾千萬行的大表記憶體問題

Python導資料的時候,需要在一個大表上讀取很大的結果集。
如果用傳統的方法,Python的記憶體會爆掉,傳統的讀取方式預設在記憶體裡快取下所有行然後再處理,記憶體容易溢位

解決的方法:
1)使用SSCursor(流式遊標),避免客戶端佔用大量記憶體。(這個cursor實際上沒有快取下來任何資料,它不會讀取所有所有到記憶體中,它的做法是從儲存塊中讀取記錄,並且一條一條返回給你。)
2)使用迭代器而不用fetchall,即省記憶體又能很快拿到資料。


import MySQLdb.cursors

conn = MySQLdb.connect(host='ip地址', user='使用者名稱'
, passwd='密碼', db='資料庫名', port=3306, charset='utf8', cursorclass = MySQLdb.cursors.SSCursor) cur = conn.cursor() cur.execute("SELECT * FROM bigtable"); row = cur.fetchone() while row is not None: do something row = cur.fetchone() cur.close()

需要注意的是,
1.因為SSCursor是沒有快取的遊標,結果集只要沒取完,這個conn是不能再處理別的sql,包括另外生成一個cursor也不行的。
如果需要幹別的,請另外再生成一個連線物件。
2. 每次讀取後處理資料要快,不能超過60s,否則mysql將會斷開這次連線,也可以修改 SET NET_WRITE_TIMEOUT = xx 來增加超時間隔。

相關推薦

python讀取千萬記憶體問題

Python導資料的時候,需要在一個大表上讀取很大的結果集。 如果用傳統的方法,Python的記憶體會爆掉,傳統的讀取方式預設在記憶體裡快取下所有行然後再處理,記憶體容易溢位 解決的方法: 1)使用SSCursor(流式遊標),避免客戶端佔用大量記憶體

Mysql千萬優化

數據庫服務 時間段 系統 時也 導致 slave 如何 1.5 傳統 Mysql的單張表的最大數據存儲量尚沒有定論,一般情況下mysql單表記錄超過千萬以後性能會變得很差。因此,總結一些相關的Mysql千萬級大表的優化策略。 1.優化sql以及索引 1.1優化sql

MySQL千萬優化解決方案

MySQL千萬級大表優化解決方案 非原創,純屬記錄一下。 背景 無意間看到了這篇文章,作者寫的很棒,於是乎,本人自私一把,把乾貨儲存下來。:-) 問題概述 使用阿里雲rds for MySQL資料庫(就是MySQL5.6版本),有個使用者上網記錄表6個月的資料量近2000萬,保留最近一年的資料量達到

php從mysql讀取超過200W

需要從一個大表,如user表中讀取所有user資料再做整理並匯出csv。如果使用框架會報記憶體不足,因為很多php框架會將資料庫資料放入臨時變數。 PHP Fatal error:  Allowed m

mysql千萬線上加索引

 create table tmp like paper_author; ALTER TABLE tmp ADD INDEX ( `PaperID` ) insert into tmp(ooo,...)  select  ooo,... from paper_auth

乾貨|一次MySQL兩千萬資料的優化過程,三種解決方案!

開發十年,就只剩下這套架構體系了! >>>   

Mysql千萬優化策略

sid 屬於 基於 卡住 行數 arch 行數據 power 基本原理 1.優化sql以及索引 1.1優化sql 1、有索引但未被用到的情況(不建議) (1)避免like的參數以通配符開頭時 盡量避免Like的參數以通配符開頭,否則數據庫引擎會放棄使用索引而進

python 讀取文件越來越慢(判斷 key 在 map 中,千萬別用 in keys())

方案 使用 tail 千萬 上傳 true 文件夾 blog alt 背景: 今天樂樂姐寫代碼,讀取一個四五百兆的文件,然後做一串的處理。結果處理了一天還沒有出來結果。問題出在哪裏呢? 解決: 1. 樂樂姐打印了在不同時間點的時間,直接print time() 即可。發

python讀取檔案的方法 python計算檔案的數和讀取某一行內容的實現方法

 python計算檔案的行數和讀取某一行內容的實現方法 :最簡單的辦法是把檔案讀入一個大的列表中,然後統計列表的長度.如果檔案的路徑是以引數的形式filepath傳遞的,那麼只用一行程式碼就可以完成我們的需求了:   1、http://blog.csdn.net/shudaq

Mysql遍歷(Mysql大量資料讀取記憶體溢位的解決方法)

mysql jdbc預設把select的所有結果全部取回,放到記憶體中,如果是要遍歷很大的表,則可能把記憶體撐爆。 一種辦法是:用limit,offset,但這樣你會發現取資料的越來越慢,原因是設定了offset,mysql需要將讀取位置移動到offset的位置,隨著offset增大,取資料也越來越慢

python 讀取文件

treat pan 出現 擔心 code including open hand you 要讀取個大文件,文件大概是3G左右,擔心read會出現內存溢出的情況,網上找了個靠譜的用法: with open(...) as f: for line in f:

mysql千萬級數據,創建及字段擴展的條建議

計算 count 兩種 沒有 key值 null .cn 優點 關系 一:概述 當我們設計一個系統時,需要考慮到系統的運行一段時間後,表裏數據量大約有多少,如果在初期,就能估算到某幾張表數據量非常龐大時(比如聊天消息表),就要把表創建好,這篇文章從創建表,增加

Python個命令參數

int for -c mil post gpo range print span 1) 以 $ python 方式啟動 python 解釋器,之後 import 一個模塊,將生成 .pyc 文件。 2) 以 $ python -O 方式啟動 python 解釋器,之

千萬級的!MySQL這樣優化更好

cached linux l數據庫 效果 pin 控制 img red 存儲引擎 對於一個千萬級的大表,現在可能更多的是億級數據量,很多人第一反應是各種切分,可結果總是事半功倍,或許正是我們優化順序的不正確。下面我們來談談怎樣的優化順序可以讓效果更好。 MySQL數據

InnoDB引擎,從中刪除多

int ota man erro delete mysql 最小 following 可能 官方建議: InnoDB Tables If you are deleting many rows from a large table, you may exceed the l

有效提升直播平臺的人氣與收益的方法,步即可造就千萬直播平臺!

裏的 來講 建立 操作 真人秀 入口 cto 慢慢 技術分享 精品薦讀!詳細講述如何有效增長提升直播平臺人氣與收益! 幾步造就千萬級大主播,提升直播平臺人氣收益就要靠這些! 現在人都在看直播,也都在玩直播,大家每天關註的新聞中,有40%左右的內容都會涉及到直播,仔細分析市場

python讀取文件的方法

href 形式 art source logs 簡單 body med tle python計算文件的行數和讀取某一行內容的實現方法 :最簡單的辦法是把文件讀入一個大的列表中,然後統計列表的長度.如果文件的路徑是以參數的形式filepath傳遞的,那麽只用一行代碼就可以

python 讀取影象的種方式

1. skimage from skimage import io img=io.imread('d:/dog.jpg',as_grey=True) #顯示影象 io.imshow(img) #儲存影象 io.imsave('d:/cat.jpg',img) 2. PIL中的I

python讀取mysql怎麼不會記憶體溢位

使用過java讀取mysql大資料量的人應該都知道,如果查詢時不開遊標不設定一次性區大小的話,會一次性的把所有記錄都拉取過來再進行後續操作,資料量一大就很容易出現OOM 如果用python去讀取mysql也會遇到同樣的問題 那麼這麼在python中來設定使用遊標呢 也很簡單 這裡

python讀取檔案和普通檔案

讀取檔案,最常見的方式是: with open('filename', 'r', encoding = 'utf-8') as f: for line in f.readlines(): do_something(line) 但是,當完成這一操作時,readlines()