{eval=Array;=+count(Array);}
我先假設題主問的大文件在1G~20G左右,這應該算常規的大文件。平常我在做機器學習模型時候我喜歡先在本機上做玩具模型,里面有個步驟就是經常要讀取文件數據,也差不多這么一個數據量。
一般來說,Python讀取大文件的方式可以使用原生的open函數或者pandas的read_csv函數都可以達到目的。
Python讀取文件一般是用open函數讀取,例如f=open(xx,"r")后f.read()就可以輕松讀取到文本內容。
如果像數據比較大的情況下,可以用read(參數)或者readline()的方式進行迭代讀取,具體代碼如下:
read_csv是Python中一個很有名的數據分析工具包pandas里面的函數,它既可以讀取txt也可以讀取csv格式文件。read_csv中有個參數是chunksize,通過指定一個chunksize分塊大小來讀取文件。具體代碼如下:
還有一個參數是iterator,可以把文件對象變為可迭代對象,只要iterator=True即可,具體代碼如下:
當然我內存只有8G所以讀取會比較慢,所以花了點時間研究了一下后有了上面這些奇淫技巧讀取速度后確實快了不少。當然如果大家有更好的方法或建議歡迎在評論區探討交流,互相學習學習。
如果你對學習人工智能和科技新聞感興趣,歡迎訂閱我的頭條號。我會在這里發布所有與科技、科學以及機器學習有關的有趣文章。偶爾也回答有趣的問題,有問題可隨時在評論區回復和討論,看到即回。
(碼字不易,若文章對你幫助可點贊支持~)
這里以讀取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文件進行數據分析處理時的內存不足問題,分享一下。
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,通過指定一個chunksize分塊大小來讀取文件,返回的是一個可迭代的對象TextFileReader,分塊處理可以避免將所有的文件載入內存,僅在使用的時候讀入所需內容。數據的處理和清洗通常使用分塊的方式處理,可以大大降低內存的使用,同時耗時要相對長一些。
輸出
指定iterator=True 也可以返回一個可迭代對象TextFileReader。
輸出
除了通過分塊避免一次性將全部內容加載至內存中,還可以嘗試如下方式讀取超大csv文件進行數據分析、處理。
若對你有幫助,點贊支持哦。
0
回答0
回答0
回答0
回答0
回答0
回答2
回答0
回答0
回答1
回答