成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

使用 Python 讀取 8 GB 大小的文件

animabear / 3120人閱讀

摘要:筆試問題如何使用讀取個大小的文件這個問題其實(shí)在筆試中會經(jīng)常遇到的個題目。解決方案在中除了使用方法讀取文件內(nèi)容外還有另外個方法和也可以進(jìn)行內(nèi)容的讀取。結(jié)果發(fā)現(xiàn)使用的方式還是會導(dǎo)致內(nèi)存不足的情況發(fā)生而通過讀取指定字節(jié)的方式則可以處理完這個文件。

筆試問題

如何使用Python讀取1個8GB大小的文件,這個問題其實(shí)在筆試中會經(jīng)常遇到的1個題目。對于在Python中讀取文件的操作,一般我們會這樣來操作:

f = open("filename","rb")
f.read()

下面我們來找1個比較大的文件,比如1個nginx的日志文件,記得之前有一次公司的1天的nginx日志文件解壓為3GB大小,不得不對其進(jìn)行切分。

發(fā)現(xiàn)問題

這里我們找到了1個3G大小的文件。接下來,我們使用普通的讀取方式來查看該文件的內(nèi)容:

f=open("test","rb")
data=f.read()
---------------------------------------------------------------------------
MemoryError                               Traceback (most recent call last)
...
MemoryError: 

我們可以看到1個MemoryError的錯誤,說明該無文件無法被裝載在內(nèi)存中發(fā)生溢出了。
下面我們來思考下為什么內(nèi)存會溢出了,在我們打開文件的時候并沒有發(fā)生任何異常,而在我們調(diào)用read方法時才出現(xiàn)問題。我們知道,文件對象的read方法會嘗試將所有內(nèi)容以1行的形式讀入,顯然這種方式對于大文件是不可行的。

解決方案

在Python中,除了使用read方法讀取文件內(nèi)容外,還有另外2個方法readline和readlines也可以進(jìn)行內(nèi)容的讀取。
既然默認(rèn)read方法是一次性的將內(nèi)容都讀取到內(nèi)存中,那么我們是否可以指定其每次讀取的長度來解決這個問題呢?

data = f.read(1024)
while 1:
  #處理該行的代碼
  data = f.read(1024)

而readlines會返回每1行讀取的內(nèi)容的列表,因此有一定風(fēng)險的。

for l in f.readlines():
   #處理這1行的代碼

那么,我們每次讀取1行總可以了把。這樣我們可以通過如下的方式來進(jìn)行:

line = f.readline()
while 1:
    #處理該行的代碼
    line = f.readline()

我們通過1個無限循環(huán)的方式來進(jìn)行讀取。結(jié)果發(fā)現(xiàn),使用readlines的方式還是會導(dǎo)致內(nèi)存不足的情況發(fā)生,而通過讀取指定字節(jié)的方式則可以處理完這個文件。
在上面的解決方案中,我們需要手動處理文件讀取的大小,并在合適的情況退出讀取的操作。
那么,我們有沒有更好的解決方案呢?實(shí)際上是有的,在Python的手冊中,有1個xreadlines的方法,這個方法就類比range和xrange函數(shù)的區(qū)別。這個方法返回類似iter(f)的字符串,但是遺憾的是該方法在Python版本2.3中已經(jīng)被淘汰了,官方建議我們使用for語句來替代:

for line in f:
    #處理該行的代碼

通過這種方式,Python將處理文件對象為1個迭代器,并自動使用緩存IO和內(nèi)存管理,這樣我們就不需要關(guān)注大的文件了。

參考文件:

http://stackoverflow.com/questions/8009882/how-to-read-large-file-line-by-line-in-python

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/37964.html

相關(guān)文章

  • Python之路--python基礎(chǔ)2

    摘要:內(nèi)容列表元組操作字符串操作字典操作集合操作文件操作字符編碼與轉(zhuǎn)碼內(nèi)置函數(shù)在中,最基本的數(shù)據(jù)結(jié)構(gòu)是序列。序列中的每個元素被分配一個序號即元素的位置,也稱為索引。空字典不包括任何項(xiàng)由兩個大括號組成。 day2內(nèi)容1、列表、元組操作2、字符串操作3、字典操作4、集合操作5、文件操作6、字符編碼與轉(zhuǎn)碼7、內(nèi)置函數(shù) 在Python中,最基本的數(shù)據(jù)結(jié)構(gòu)是序列(sequence)。序列中的每個元素被...

    Binguner 評論0 收藏0
  • 一個簡單python爬蟲實(shí)現(xiàn)——爬取電影信息

    摘要:最近在學(xué)習(xí)網(wǎng)絡(luò)爬蟲,完成了一個比較簡單的網(wǎng)絡(luò)爬蟲。網(wǎng)絡(luò)爬蟲,可以理解為自動幫你在網(wǎng)絡(luò)上收集數(shù)據(jù)的機(jī)器人。網(wǎng)絡(luò)爬蟲簡單可以大致分三個步驟第一步要獲取數(shù)據(jù),第二步對數(shù)據(jù)進(jìn)行處理,第三步要儲存數(shù)據(jù)。 最近在學(xué)習(xí)網(wǎng)絡(luò)爬蟲,完成了一個比較簡單的python網(wǎng)絡(luò)爬蟲。首先為什么要用爬蟲爬取信息呢...

    番茄西紅柿 評論0 收藏2637
  • 奇技淫巧第二期

    摘要:因?yàn)楫a(chǎn)生的順序是先比較第一位,再比較第二位,并且沒有很好的解決辦法。這種語法的限制是,需要保證異常從屬與異常。兩個異常都將顯示。 這個系利的初衷是回顧瑣碎知識點(diǎn),但...

    Rocture 評論0 收藏0
  • 如何優(yōu)化Python占用內(nèi)存

    摘要:概述如果程序處理的數(shù)據(jù)比較多比較復(fù)雜,那么在程序運(yùn)行的時候,會占用大量的內(nèi)存,當(dāng)內(nèi)存占用到達(dá)一定的數(shù)值,程序就有可能被操作系統(tǒng)終止,特別是在限制程序所使用的內(nèi)存大小的場景,更容易發(fā)生問題。下面我就給出幾個優(yōu)化占用內(nèi)存的幾個方法。 概述 如果程序處理的數(shù)據(jù)比較多、比較復(fù)雜,那么在程序運(yùn)行的時候,會占用大量的內(nèi)存,當(dāng)內(nèi)存占用到達(dá)一定的數(shù)值,程序就有可能被操作系統(tǒng)終止,特別是在限制程序所使用...

    ThreeWords 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<