處理大數據的方法有很多,目前我知道就這么多,后面會持續更新:
一、將數據分批次讀取
csv格式是常見的數據存儲方式,對於我們普通人而言易於讀寫。此外,在pandas中有pd.read_csv()函數可以將csv形式的數據進行讀取。但當csv文件非常大的時候,直接讀取會很吃內存,甚至會出現內存不夠用的情況。
這時候我們可以 分批次(分塊)讀取,而不是一次性讀取 這么大體量的數據。操作步驟:
- 分批次讀取
- 處理每一批次
- 保存每一批次的結果
- 對所有的數據重復步驟1-3
- 將所有的批次結果都結合起來
pd.read_csv(chunksize)
中的chunksize指的的是每一批次的行數
import pandas as pd chunk_iterator = pd.read_csv("test.vcf",sep="\t", chunksize=10000) chunk_result_list = [] #每一批次都是dataframe類型 for chunk in chunk_iterator: #根據你的分析問題,設計自己的chunk_manipulate函數 filter_result = chunk_manipulate(chunk) chunk_result_list.append(filter_result) #合並所有批次處理結果,形成新的dataframe df = pd.concat(chunk_result_list)
二、常用方法讀取大型文件
面對100w行的大型數據,經過測試各種文件讀取方式,得出結論:
with open(filename,"rb") as f: for fLine in f: pass
這種方式最快,100w行全遍歷2.7秒。
基本滿足中大型文件處理效率需求。如果rb改為r,慢6倍。但是此方式處理文件,fLine為bytes類型。但是python自行斷行,仍舊能很好的以行為單位處理讀取內容。
四、文本處理效率問題
這里舉例ascii定長文件,因為這個也並不是分隔符文件,所以打算采用列表操作實現數據分割。但是問題是處理20w條數據,時間急劇上升到12s。本以為是byte.decode增加了時間。遂去除decode全程bytes處理。但是發現效率還是很差。
最后用最簡單方式測試,首次運行,最簡單方式也要7.5秒100w次。
那么關於python處理大文件的技巧,從網絡整理三點:列表、文件屬性、字典三個點來看看。
1.列表處理
def fun(x): 盡量選擇集合、字典數據類型,千萬不要選擇列表,列表的查詢速度會超級慢,同樣的,在已經使用集合或字典的情況下,不要再轉化成列表進行操作,比如:
2. 對於文件屬性
如果遇到某個文件,其中有屬性相同的,但又不能進行去重操作,沒有辦法使用集合或字典時,可以增加屬性,比如將原數據重新映射出一列計數屬性,讓每一條屬性具有唯一性,從而可以用字典或集合處理:
3. 對於字典
多使用iteritems()少使用items(),iteritems()返回迭代器: