之前使用Python讀取超大CSV文件時,出現MemoryError錯誤,甚至死機。。。嘔心瀝血潛心研究後,發現使用pandas的read_csv模塊通過分塊讀取,可以完美解決針對超大CSV文件進行數據分析處理時的內存不足問題,接下來與大家分享一下。
pandas 安裝
Anaconda是一個開源的Python發行版本,其包含了conda、Python、numpy、pandas等180多個科學包及其依賴項。建議直接安裝Anaconda2 或 Anaconda3 ,最好裝64位。
下載地址如下:
https://www.anaconda.com/
read_csv官方文檔鏈接:
http://pandas.pydata.org/pandas-docs/stable/io.html#io-read-csv-table
從官方文檔中我們注意到chunksize 、iterator兩個參數,下面我們就這兩個參數做詳細介紹 。
Iteration
iterator : boolean, default False
Return TextFileReader object for iteration or getting chunks with get_chunk().
chunksize : int, default None
Return TextFileReader object for iteration. See iterating and chunking below.
read_csv——chunksize參數介紹
read_csv中有個參數chunksize,通過指定一個chunksize分塊大小來讀取文件,返回的是一個可迭代的對象TextFileReader,分塊處理可以避免將所有的文件載入內存,僅在使用的時候讀入所需內容。數據的處理和清洗通常使用分塊的方式處理,可以大大降低內存的使用,同時耗時要相對長一些。
import pandas as pd
reader = pd.read_csv('pandas.csv', sep='|',chunksize=2)
for chunksize_data in reader:
print chunksize_data
輸出
read_csv——iterator參數
指定iterator=True 也可以返回一個可迭代對象TextFileReader。
import pandas as pd
reader = pd.read_table('pandas.csv', sep='|', iterator=True)
status = True
while status:
try:
chunk = reader.get_chunk(2)
print chunk
except StopIteration:
status = False
輸出
除了通過分塊避免一次性將全部內容加載至內存中,還可以嘗試如下方式讀取超大csv文件進行數據分析、處理。
- 對數據進行降維
- 增大機器內存或使用spark集群(pyspark)
閱讀更多 測試開發技術棧 的文章