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個小時,操作量還是上了乙個相當的規模。由於之前沒有進行過超大檔案的讀寫,一開始以為需要使用分布式系統等複雜的操作才能進行。後...