Python chunk讀取超大檔案

2021-09-22 08:11:17 字數 3802 閱讀 4370

16gb小水存已經不能適應動輒4gb、8gb的資料檔案了。

查詢到pandas的read_csv()提供了chunk分塊讀取能力。

這是一張原始的table

in [185]: table = pd.read_csv('tmp.sv', sep='|')

in [186]: table

out[186]:

unnamed: 0 0 1 2 3

0 0 0.469112 -0.282863 -1.509059 -1.135632

1 1 1.212112 -0.173215 0.119209 -1.044236

2 2 -0.861849 -2.104569 -0.494929 1.071804

3 3 0.721555 -0.706771 -1.039575 0.271860

4 4 -0.424972 0.567020 0.276232 -1.087401

5 5 -0.673690 0.113648 -1.478427 0.524988

6 6 0.404705 0.577046 -1.715002 -1.039268

7 7 -0.370647 -1.157892 -1.344312 0.844885

8 8 1.075770 -0.109050 1.643563 -1.469388

9 9 0.357021 -0.674600 -1.776904 -0.968914

指定chunksize=4,表明每4行為1個chunk。

in [187]: reader = pd.read_csv('tmp.sv', sep='|', chunksize=4)

in [188]: reader

out[188]: in [189]: for chunk in reader:

.....: print(chunk)

.....:

unnamed: 0 0 1 2 3

0 0 0.469112 -0.282863 -1.509059 -1.135632

1 1 1.212112 -0.173215 0.119209 -1.044236

2 2 -0.861849 -2.104569 -0.494929 1.071804

3 3 0.721555 -0.706771 -1.039575 0.271860

unnamed: 0 0 1 2 3

4 4 -0.424972 0.567020 0.276232 -1.087401

5 5 -0.673690 0.113648 -1.478427 0.524988

6 6 0.404705 0.577046 -1.715002 -1.039268

7 7 -0.370647 -1.157892 -1.344312 0.844885

unnamed: 0 0 1 2 3

8 8 1.075770 -0.10905 1.643563 -1.469388

9 9 0.357021 -0.67460 -1.776904 -0.968914

返回的reader是textfilereader型別,它指向若干個chunk位置,只在訪問資料的時候才真正把資料讀入到記憶體。

這是乙個可迭代的型別,採用for in的形式,即可逐個訪問chunk。

每個chunk都是dataframe型別的。

還有乙個邪教用法。

如果想跟陣列一樣,訪問第i個chunk要怎麼做?

使用 get_chunk(i)這個函式就可以了。

但是根據測試,get_chunk(i),在我這台機子上是固定10行為1個chunk,不受chunksize引數調整。

挺邪乎。

in [190]: reader = pd.read_csv('tmp.sv', sep='|', iterator=true)

in [191]: reader.get_chunk(5)

out[191]:

unnamed: 0 0 1 2 3

0 0 0.469112 -0.282863 -1.509059 -1.135632

1 1 1.212112 -0.173215 0.119209 -1.044236

2 2 -0.861849 -2.104569 -0.494929 1.071804

3 3 0.721555 -0.706771 -1.039575 0.271860

4 4 -0.424972 0.567020 0.276232 -1.087401

1.獲取行數

count = 0

fp = open('totalexposurelog.out','r', encoding='utf-8')

while 1:

buffer = fp.read(8*1024*1024)

if not buffer:

break

count += buffer.count('\n')

print(count)

fp.close()

//

這樣你心裡就有x數了,知道這個檔案有多少行。

估算自己的記憶體大概撐得住多少行的資料,把原始資料劃分為多少塊比較合適。

例如我這個檔案有102386695行,四捨五入1個億。

大概劃分成500萬行,20個chunk就可以了。

2.使用chunk來read_csv

#1億行,每500w為1個chunk

reader = pd.read_csv('totalexposurelog.out', sep='\t',chunksize=5000000)

for i,ck in enumerate(reader):

print(i,' ',len(ck))

ck.to_csv('../data/bb_'+str(i)+'.csv', index=false)

迭代訪問即可。

3.合併表

使用pandas.concat

當axis = 0時,concat的效果是列對齊。

#我的資料分了21個chunk,標號是0~20

loader = [pd.read_csv('../data/bb_'+str(i)+'.csv') for i in range(21)]

pd.concat(loader, axis=0).reset_index(drop=true)

一般來說小水存是不可能把21個chunk都concat到一起的。

根據實際情況調整吧。

php 讀取超大檔案

php開發很多時候都要讀取大檔案,比如csv檔案 text檔案等。這些檔案如果很大,比如10個g。這時,直接一次性把所有的內容讀取到記憶體中計算不太現實。遇到這種情況,往往覺得php太弱,實則不然。利用生成器 關鍵字yield 就能解決。好了,上 created by phpstorm.user a...

php讀取超大檔案fseek

function readmaxfile fp start 0 fseek fp,start,seek set res fread fp,1 content res if substr content,strlen tag tag start 1 if feof fp sleep 3 echo 從位...

Java讀取超大文字檔案

近日由於相關業務,需要讀取乙個將近1g的檔案,然後將符合條件的資料insert進資料庫。而執行完程式之後,最後寫入資料庫的資料是將近100w條,在linux系統下執行時間將近3個小時,操作量還是上了乙個相當的規模。由於之前沒有進行過超大檔案的讀寫,一開始以為需要使用分布式系統等複雜的操作才能進行。後...