回覆列表
-
1 # 民叔程式設計大法
-
2 # 半葉子
可以採用分段式來對資料進行讀取和分析,之後在進行整合。
我舉一個簡單的例子,我要複製一個大檔案,我不能都將他們讀取到記憶體中,於是我分段式進行讀取和寫入。
因為我也在學習python,如果未能解決您的問題,請勿見怪。
size=100*1024*1024#單次獲取的尺寸 100*1024*1024=100MBwith open("CAD2016_64bit.zip", "rb") as paer_reasd: with open("CAD2016_64bit1.zip","ab") as paer_wirte: x=1 while True: data = paer_reasd.read(size) if not data : break paer_wirte.write(data) print("%s寫入完畢"%x) x+=1 -
3 # 歪筆獨遊
思路是拆分或分而治之。
比如利用磁碟儲存做外排序。如果單臺機器磁碟空間或者運算能力不足,可以使用分散式多機運算。
一般來說,把資料按一定規則分成多塊,利用磁碟足以滿足個人需求。這個需要根據實際需求來劃分;比如記憶體只有1g,需要從長度為2^33的整數陣列中找到最大的數,因為記憶體不足,不能直接在記憶體中完成,可以考慮“外排序”,將陣列資料存為n個檔案,從每個檔案中找出最大的數,再從各個最大的數中找出最終的最大數,如果熟悉演算法,此問題可以借用二叉堆來處理。
簡單的處理思路,可以利用現成方案,比如能處理大資料的資料庫或框架來完成(MongoDB,Cassandra,Hbase等)。
複雜的處理,可能需要特定演算法和各種設施的配合。
當然,如果只是為了臨時解決問題,可以不修改程式碼,僅靠增加虛擬記憶體來簡單粗暴直接地解決問題。
-
4 # DoItYourself
具體要看什麼樣的資料啦,如果是大資料量的Excel資料,Python有天然的資料處理庫pandas。
它具備Excel表的一切功能,從多表拼接,合併,查詢,替換,到資料透視表,無所不能,特別適合千萬級資料記錄的大數量的處理。
一切順利,加油。
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()
conn.close()
需要注意的是,
1、因為SSCursor是沒有快取的遊標,結果集只要沒取完,這個conn是不能再處理別的sql,包括另外生成一個cursor也不行的。
如果需要幹別的,請另外再生成一個連線物件。
2、 每次讀取後處理資料要快,不能超過60s,否則mysql將會斷開這次連線,也可以修改 SET NET_WRITE_TIMEOUT = xx 來增加超時間隔。
import pandas as pd
def read_data(file_name):
"""
file_name:檔案地址
"""
inputfile = open(file_name, "rb") #可開啟含有中文的地址
data = pd.read_csv(inputfile, iterator=True)
loop = True
chunkSize = 1000 #一千行一塊
chunks = []
while loop:
try:
chunk = data.get_chunk(chunkSize)
chunks.append(chunk)
except StopIteration:
loop = False
print("Iteration is stopped.")
data = pd.concat(chunks, ignore_index=True)
#print(train.head())
return data