{eval=Array;=+count(Array);}

成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

問(wèn)答專欄Q & A COLUMN

如何使用Python讀取大文件?

TangpjTangpj 回答0 收藏2
收藏問(wèn)題

3條回答

funnyZhang

funnyZhang

回答于2022-06-28 15:56

我先假設(shè)題主問(wèn)的大文件在1G~20G左右,這應(yīng)該算常規(guī)的大文件。平常我在做機(jī)器學(xué)習(xí)模型時(shí)候我喜歡先在本機(jī)上做玩具模型,里面有個(gè)步驟就是經(jīng)常要讀取文件數(shù)據(jù),也差不多這么一個(gè)數(shù)據(jù)量。

一般來(lái)說(shuō),Python讀取大文件的方式可以使用原生的open函數(shù)或者pandas的read_csv函數(shù)都可以達(dá)到目的。

open函數(shù)

Python讀取文件一般是用open函數(shù)讀取,例如f=open(xx,"r")后f.read()就可以輕松讀取到文本內(nèi)容。

如果像數(shù)據(jù)比較大的情況下,可以用read(參數(shù))或者readline()的方式進(jìn)行迭代讀取,具體代碼如下:

read_csv()

read_csv是Python中一個(gè)很有名的數(shù)據(jù)分析工具包pandas里面的函數(shù),它既可以讀取txt也可以讀取csv格式文件。read_csv中有個(gè)參數(shù)是chunksize,通過(guò)指定一個(gè)chunksize分塊大小來(lái)讀取文件。具體代碼如下:

還有一個(gè)參數(shù)是iterator,可以把文件對(duì)象變?yōu)榭傻鷮?duì)象,只要iterator=True即可,具體代碼如下:

當(dāng)然我內(nèi)存只有8G所以讀取會(huì)比較慢,所以花了點(diǎn)時(shí)間研究了一下后有了上面這些奇淫技巧讀取速度后確實(shí)快了不少。當(dāng)然如果大家有更好的方法或建議歡迎在評(píng)論區(qū)探討交流,互相學(xué)習(xí)學(xué)習(xí)。


如果你對(duì)學(xué)習(xí)人工智能和科技新聞感興趣,歡迎訂閱我的頭條號(hào)。我會(huì)在這里發(fā)布所有與科技、科學(xué)以及機(jī)器學(xué)習(xí)有關(guān)的有趣文章。偶爾也回答有趣的問(wèn)題,有問(wèn)題可隨時(shí)在評(píng)論區(qū)回復(fù)和討論,看到即回。

(碼字不易,若文章對(duì)你幫助可點(diǎn)贊支持~)

評(píng)論0 贊同0
  •  加載中...
zzbo

zzbo

回答于2022-06-28 15:56

這里以讀取txt大文件為例,簡(jiǎn)單介紹一下Python是如何讀取大文件的,系統(tǒng)內(nèi)存在8G左右,txt文件的大小為5G,實(shí)驗(yàn)環(huán)境win10+python3.6+pycharm2018,主要內(nèi)容如下:

1.首先,按照最原始的方法讀取txt文件,即用open函數(shù)直接打開(kāi)txt文件,一次將所有數(shù)據(jù)讀入到內(nèi)存中,這里如果文件大于系統(tǒng)運(yùn)行內(nèi)存,會(huì)直接報(bào)Memery Error錯(cuò)誤,測(cè)試代碼如下,非常簡(jiǎn)單:

運(yùn)行這個(gè)程序,讀取花費(fèi)時(shí)間大概在41s左右,如下:

2.最基本的方法,為了提高讀取速度,以二進(jìn)制方式打開(kāi)文件,測(cè)試代碼如下,對(duì)上面的代碼只需要稍微修改一下就行,open打開(kāi)時(shí),設(shè)置方式為rb:

運(yùn)行這個(gè)程序,截圖如下,讀取時(shí)間大概在7s左右,明顯比直接讀取快6倍左右:

3.為了更快的提高讀取速度,這里我們?cè)趓ead讀取文件的時(shí)候,可以按塊大小讀取,每次讀取一定大小的塊,依次循環(huán),直到整個(gè)文件讀完,測(cè)試代碼如下,也非常簡(jiǎn)單:

運(yùn)行這個(gè)程序,截圖如下,讀取時(shí)間大概在3.5s左右,比上面直接讀取快2倍左右:

4.這里還有一種提高讀取的方法就是使用with open打開(kāi)文件,把文件對(duì)象視為一個(gè)迭代器,系統(tǒng)會(huì)自動(dòng)使用緩沖IO和內(nèi)存管理,所以讀取速度也會(huì)有一定提升,測(cè)試代碼如下:

運(yùn)行程序,讀取時(shí)間大概在26s左右,比直接讀取快1倍左右,如下:

5.當(dāng)然,對(duì)于其他類型的大文件,像CSV,Excel等,讀取時(shí)也可以按塊讀取,速度也會(huì)有明顯的提升,基本代碼如下,每次讀取一定塊大小的文件,直到整個(gè)文件讀完:

至此,我們就完成了使用Python讀取大文件??偟膩?lái)說(shuō),基本思想就是按塊讀取,每次只讀取一定塊大小的數(shù)據(jù),這樣讀取速度會(huì)有明顯提升,網(wǎng)上也有相關(guān)教程和資料,介紹的非常詳細(xì),感興趣的話,可以搜一下,希望以上分享的內(nèi)容能對(duì)你有所幫助吧,也歡迎大家評(píng)論、留言進(jìn)行補(bǔ)充。

評(píng)論0 贊同0
  •  加載中...
Tangpj

Tangpj

回答于2022-06-28 15:56

之前使用Python讀取超大CSV文件時(shí),出現(xiàn)MemoryError錯(cuò)誤,甚至死機(jī)。。。嘔心瀝血潛心研究后,發(fā)現(xiàn)使用pandas的read_csv模塊通過(guò)分塊讀取,可以完美解決針對(duì)超大CSV文件進(jìn)行數(shù)據(jù)分析處理時(shí)的內(nèi)存不足問(wèn)題,分享一下。

pandas 安裝

Anaconda是一個(gè)開(kāi)源的Python發(fā)行版本,其包含了conda、Python、numpy、pandas等180多個(gè)科學(xué)包及其依賴項(xiàng)。建議直接安裝Anaconda2 或 Anaconda3 ,最好裝64位。

下載地址如下:

https://www.anaconda.com/

read_csv官方文檔鏈接:

http://pandas.pydata.org/pandas-docs/stable/io.html#io-read-csv-table

從官方文檔中我們注意到chunksize 、iterator兩個(gè)參數(shù),下面我們就這兩個(gè)參數(shù)做詳細(xì)介紹 。

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參數(shù)介紹

read_csv中有個(gè)參數(shù)chunksize,通過(guò)指定一個(gè)chunksize分塊大小來(lái)讀取文件,返回的是一個(gè)可迭代的對(duì)象TextFileReader,分塊處理可以避免將所有的文件載入內(nèi)存,僅在使用的時(shí)候讀入所需內(nèi)容。數(shù)據(jù)的處理和清洗通常使用分塊的方式處理,可以大大降低內(nèi)存的使用,同時(shí)耗時(shí)要相對(duì)長(zhǎng)一些。

輸出

read_csv——iterator參數(shù)

指定iterator=True 也可以返回一個(gè)可迭代對(duì)象TextFileReader。

輸出


其他方式

除了通過(guò)分塊避免一次性將全部?jī)?nèi)容加載至內(nèi)存中,還可以嘗試如下方式讀取超大csv文件進(jìn)行數(shù)據(jù)分析、處理。

  1. 對(duì)數(shù)據(jù)進(jìn)行降維
  2. 增大機(jī)器內(nèi)存或使用spark集群(pyspark)


若對(duì)你有幫助,點(diǎn)贊支持哦。

評(píng)論0 贊同0
  •  加載中...

最新活動(dòng)

您已邀請(qǐng)0人回答 查看邀請(qǐng)

我的邀請(qǐng)列表

  • 擅長(zhǎng)該話題
  • 回答過(guò)該話題
  • 我關(guān)注的人
向幫助了您的網(wǎng)友說(shuō)句感謝的話吧!
付費(fèi)偷看金額在0.1-10元之間
<