-
1 # 軟體測試開發技術棧
-
2 # LIFE與Python
使用while 循壞方法,分塊讀取檔案,設定一個塊的大小,第一個read是給while迴圈賦初始值,第二個read是接著,初始值後面繼續讀取檔案。這種方法來處理大檔案,這種方法讀取快也可以預防一些錯誤。 讀取和寫入完成一定要記得關閉檔案。
-
3 # 小小猿愛嘻嘻
這裡以讀取txt大檔案為例,簡單介紹一下Python是如何讀取大檔案的,系統記憶體在8G左右,txt檔案的大小為5G,實驗環境win10+python3.6+pycharm2018,主要內容如下:
1.首先,按照最原始的方法讀取txt檔案,即用open函式直接開啟txt檔案,一次將所有資料讀入到記憶體中,這裡如果檔案大於系統執行記憶體,會直接報Memery Error錯誤,測試程式碼如下,非常簡單:
執行這個程式,讀取花費時間大概在41s左右,如下:
2.最基本的方法,為了提高讀取速度,以二進位制方式開啟檔案,測試程式碼如下,對上面的程式碼只需要稍微修改一下就行,open開啟時,設定方式為rb:
執行這個程式,截圖如下,讀取時間大概在7s左右,明顯比直接讀取快6倍左右:
3.為了更快的提高讀取速度,這裡我們在read讀取檔案的時候,可以按塊大小讀取,每次讀取一定大小的塊,依次迴圈,直到整個檔案讀完,測試程式碼如下,也非常簡單:
執行這個程式,截圖如下,讀取時間大概在3.5s左右,比上面直接讀取快2倍左右:
4.這裡還有一種提高讀取的方法就是使用with open開啟檔案,把檔案物件視為一個迭代器,系統會自動使用緩衝IO和記憶體管理,所以讀取速度也會有一定提升,測試程式碼如下:
執行程式,讀取時間大概在26s左右,比直接讀取快1倍左右,如下:
5.當然,對於其他型別的大檔案,像CSV,Excel等,讀取時也可以按塊讀取,速度也會有明顯的提升,基本程式碼如下,每次讀取一定塊大小的檔案,直到整個檔案讀完:
至此,我們就完成了使用Python讀取大檔案。總的來說,基本思想就是按塊讀取,每次只讀取一定塊大小的資料,這樣讀取速度會有明顯提升,網上也有相關教程和資料,介紹的非常詳細,感興趣的話,可以搜一下,希望以上分享的內容能對你有所幫助吧,也歡迎大家評論、留言進行補充。
回覆列表
之前使用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,分塊處理可以避免將所有的檔案載入記憶體,僅在使用的時候讀入所需內容。資料的處理和清洗通常使用分塊的方式處理,可以大大降低記憶體的使用,同時耗時要相對長一些。
輸出
read_csv——iterator引數指定iterator=True 也可以返回一個可迭代物件TextFileReader。
輸出
其他方式除了透過分塊避免一次性將全部內容載入至記憶體中,還可以嘗試如下方式讀取超大csv檔案進行資料分析、處理。
對資料進行降維增大機器記憶體或使用spark叢集(pyspark)