国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

animabear / 3064人閱讀

摘要:筆試問題如何使用讀取個大小的文件這個問題其實在筆試中會經常遇到的個題目。解決方案在中除了使用方法讀取文件內容外還有另外個方法和也可以進行內容的讀取。結果發現使用的方式還是會導致內存不足的情況發生而通過讀取指定字節的方式則可以處理完這個文件。

筆試問題

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

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

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

發現問題

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

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

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

解決方案

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

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

而readlines會返回每1行讀取的內容的列表,因此有一定風險的。

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

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

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

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

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

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

參考文件:

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37964.html

相關文章

  • Python之路--python基礎2

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

    Binguner 評論0 收藏0
  • 一個簡單python爬蟲實現——爬取電影信息

    摘要:最近在學習網絡爬蟲,完成了一個比較簡單的網絡爬蟲。網絡爬蟲,可以理解為自動幫你在網絡上收集數據的機器人。網絡爬蟲簡單可以大致分三個步驟第一步要獲取數據,第二步對數據進行處理,第三步要儲存數據。 最近在學習網絡爬蟲,完成了一個比較簡單的python網絡爬蟲。首先為什么要用爬蟲爬取信息呢...

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

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

    Rocture 評論0 收藏0
  • 如何優化Python占用內存

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

    ThreeWords 評論0 收藏0

發表評論

0條評論

animabear

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<