python 讀取 超大文字會帶來 以下問題:
1、記憶體溢位;
2、處理效率低;
處理問題1的思路有如下幾種方案:
1、分塊讀取。
1) read()函式會將資料一次性讀取到記憶體中,可通過將資料分塊讀取,readline()函式逐行讀取;
2) 一次限制讀取的檔案的大小,利用iter和yield來控制每次讀取的檔案位置;
# 利用生成器是可以迭代的,但只可以讀取它一次。因為用的時候才生成
# yield就是 return 返回乙個值,並且記住這個返回的位置,下次迭代就從這個位置後(下一行)開始
def read_in_blocks(file_obj, block_size = 2048):
"""逐件讀取檔案
預設塊大小:2kb
"""while true:
data = file_obj.read(block_size) # 每次讀取指定的長度
if not data:
break
yield data
with open('filename', 'r', encoding = 'utf-8') as f:
for chuck in read_in_blocks(f):
do_something(block)
3)利用python自帶的直譯器工具,利用with
語句控制代碼負責開啟和關閉檔案(包括在內部塊中引發異常時),for line in f
將檔案物件f
視為乙個可迭代的資料型別,會自動使用io
快取和記憶體管理,這樣就可以處理大資料檔案。
2、存入資料庫中進行進一步處理
3、利用pandas庫來進行處理read_csv(),利用dataframe資料格式來處理,乙個dataframe是乙個二維的表結構。pandas的dataframe可以儲存許多種不同的資料型別,並且每乙個座標軸都有自己的標籤。可以把它想象成乙個series的字典項。另一種series是乙個一維的資料類,類似於乙個list。
不過一般來說,用pandas處理小於100兆的資料,效能不是問題。當用pandas來處理100兆至幾個g的資料時,將會比較耗時,同時會導致程式因記憶體不足而執行失敗。
# python 讀取億級資料**
# pandas提供了io工具可以將大檔案分塊讀取
# 使用不同分塊大小來讀取再呼叫 pandas.concat 連線dataframe,chunksize設定在1000萬條左右速度優化比較明顯。
# 實驗結果足以說明,在非">5tb"資料的情況下,python適合做統計分析。
# encoding: utf-8
import sys
import time
import pandas as pd
t1=time.time()
reader = pd.read_csv('c:/taobao/22.csv', iterator=true)
loop = true
chunksize =10000000
chunks =
while loop:
try:
chunk = reader.get_chunk(chunksize)
except stopiteration:
loop = false
print "iteration is stopped."
df = pd.concat(chunks, ignore_index=true)
print df
t2=time.time()
print u'總共耗時:' + str(t2 - t1) + 's'
4、更加複雜和大量的資料可以借助於spark,其中spark不支援標準的json格式,僅支援單條資料為json格式。 python 讀取大檔案
以前一直沒有關注過python讀取大檔案的問題,因為一直都是順順暢暢地讀取了檔案。直到今天有人問我python怎麼讀取檔案出現了記憶體不足的錯誤?我才發現原來大檔案 gb級別 的讀取和普通檔案的讀取是不一樣的。下面介紹三種我親測可用的方法。這裡的檔案型別可以是txt,dat等型別的檔案。用read ...
python讀取大檔案
最近在學習python的過程中接觸到了python對檔案的讀取。python讀取檔案一般情況是利用open 函式以及read 函式來完成 f open filename,r f.read 這種方法讀取小檔案,即讀取遠遠大小小於記憶體的檔案顯然沒有什麼問題。但是如果是將乙個10g大小的日誌檔案讀取,即...
python讀取大檔案 python讀取大檔案
python讀取檔案對各列進行索引 可以用readlines,也可以用readline,如果是大檔案一般就用readlined a in open testfile.txt r for line in a in columnssplit line.rstrip split d columnsspli...