大文件的切割与归并(数据分析案例三)
生活随笔
收集整理的這篇文章主要介紹了
大文件的切割与归并(数据分析案例三)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
- 本節內容的數據見電腦F:\python數據\Python海量數據(精縮版) 或 百度網盤“我的數據文件/Python海量數據”
本節內容基于大文件里面內容的快速查找的基礎上延申
1.先了解以下QQ.txt
2.讀取數據的行數
filepath="E:/python數據分析/百度網盤/Python數據分析海量數據營銷day4/Python數據分析海量數據營銷day4/QQfile/QQ.txt" QQfile=open(filepath,"rb") i=0 while True:line=QQfile.readline()if i%10000000==0: #讀取的時候,每100萬讀取一次print(i)if not line:breakelse:i+=1 print("end=",i) QQfile.close()3.將倒排索引存到文件里
def getuser(num):csdninputfile.seek(num,0) #跳到文件的位置。根據文件排序line=csdninputfile.readline()line=line.decode("gbk","ignore")linelist=line.split("----")if len(linelist)==2:return linelist[0]else:return ""filepath="QQ.txt" csdninputfile=open(filepath,"rb") csdnlist=csdninputfile.readlines()lengthlist=[0] for line in csdnlist:lengthlist.append(len(line)) #讀取每一行的長度到數組 del csdnlist print("read")i=0 length=len(lengthlist) while i <length -1:lengthlist[i]+=lengthlist[i-1] #疊加,確定每一行的文件位置i+=1 del lengthlist[len(lengthlist)-1] #刪除最后一個 print("get") lengthlist.sort(key=lambda x:getuser(x))#根據文件排序索引, print("sort")print("index made") indexfilepath="QQindex.txt" saveindexfile=open(indexfilepath,"wb") for i in range(len(lengthlist)-1):#保存為等長,為了隨機訪問saveindexfile.write(format(lengthlist[i],"15d").encode("utf-8")) saveindexfile.close()
事實上,這個程序要運行四五十分鐘而且會中途崩掉好幾次(數據量巨大)
因為數據量實在是太巨大了,所以我們必須對大文件進行切割和歸并處理
一、數據切割算法
1.把num平均分成N等分
- 我們想把100個數切分成10個文件,那么切割得到[10,10,10,10,10,10,10,10,10,10]
- 而如果這個數不是整數,如97,那我們想把它切割成10個文件,可以切分成[10,10,10,10,10,10,10,10,10,7]
具體的算法是[10,10,10,10,10,10,10,10,10,7]里面包含[(97-97%10)//(10-1)]個10和1個7 - 103想切分成10個文件,那么就是[11,11,11,11,11,11,11,11,11,4],里面包含[(103-103%10)//(10-1)]個11和1個4
- num想切分成N個文件,每個文件包含[(num-num%N)//(N-1)]個數以及一個額外的數
2.把大文件均分成N個小文件
def evgSplit(num,N):lastlist=[]if num%N==0:for i in range(N):lastlist.append(num//N)else:evg= (num-num%N)//(N-1)for i in range(N-1):lastlist.append(evg)num-=evglastlist.append(num)return lastlistfilelineslist=evgSplit(84319637,10) #84319637是QQ.txt的行數,filelineslist得到一個[9368847, 9368847, 9368847, 9368847, 9368847, 9368847, 9368847, 9368847, 9368847, 14]的列表 filepath="E:/python數據分析/百度網盤/Python數據分析海量數據營銷day4/Python數據分析海量數據營銷day4/QQfile/QQ.txt" filedir="E:/python數據分析/百度網盤/Python數據分析海量數據營銷day4/Python數據分析海量數據營銷day4/QQfile/qqsplit" allfile=open(filepath,"rb") for i in range(len(filelineslist)):tmpfilepath=filedir+"/QQ"+str(i)+".txt" #如:E:/python數據分析/百度網盤/Python數據分析海量數據營銷day4/Python數據分析海量數據營銷day4/QQfile/qqsplit//QQ0.txt"tmpfile=open(tmpfilepath,"wb")for j in range(filelineslist[i]):line=allfile.readline()tmpfile.write(line)tmpfile.close() allfile.close()二、數據歸并算法
import os filedir="E:/python數據分析/百度網盤/Python數據分析海量數據營銷day4/Python數據分析海量數據營銷day4/QQfile/qqsplit" #原來的那10個文件都在這個目錄下 #print(os.listdir(filedir)) 得到['QQ0.txt','QQ1.txt','QQ2.txt','QQ3.txt'...] allfilepath="E:/python數據分析/百度網盤/Python數據分析海量數據營銷day4/Python數據分析海量數據營銷day4/QQfile/QQMerge.txt" #這是合并的文件 allfile=open(allfilepath,"wb") for filename in os.listdir(filedir):print(filedir+"//"+filename) #如:"E:/python數據分析/百度網盤/Python數據分析海量數據營銷day4/Python數據分析海量數據營銷day4/QQfile/qqsplit//QQ0.txt"tmpfile=open(filedir+"//"+filename,"rb")while True:line=tmpfile.readline()if not line:breakelse:allfile.write(line)tmpfile.close() allfile.close()三、數據歸并排序法
1.頭索引排序
我們不能對一個大文件一次性排序那就只能先對切割后的小文件分別排序然后歸并
2.下標排序
之前排序時會邊合并邊刪去小文件里的元素,如果小文件不能刪的時候,那就得用下表排序
四、對人人網的數據文件進行歸并排序
1.直接對人人網數據排序
renrenpath="E:/python數據分析/百度網盤/Python數據分析海量數據營銷day4/Python數據分析海量數據營銷day4/renren500w_16610/xh-2.txt" renrenfile=open(renrenpath,"rb") renrenlist=renrenfile.readlines() renrenfile.close() print("read") renrenlist.sort(key=lambda x:x.decode("gbk","ignore")) #別忘了解碼,要不然你看不了 print("sort")renrensortpath="E:/python數據分析/百度網盤/Python數據分析海量數據營銷day4/Python數據分析海量數據營銷day4/renren500w_16610/xhsort-2.txt" renrensortfile=open(renrensortpath,"wb") for line in renrenlist:renrensortfile.write(line) renrensortfile.close() print("save")2.將人人網數據切割
#已知該文件有4768600行,我們把它切割成兩個文件,一個是2000000行,一個是2768600filelineslist=[2000000,2768600] filepath="E:/python數據分析/百度網盤/Python數據分析海量數據營銷day4/Python數據分析海量數據營銷day4/renren500w_16610/xh-2.txt" filedir="E:/python數據分析/百度網盤/Python數據分析海量數據營銷day4/Python數據分析海量數據營銷day4/renren500w_16610/" allfile=open(filepath,"rb") for i in range(len(filelineslist)):tmpfilepath=filedir+"/renren____"+str(i)+".txt"tmpfile=open(tmpfilepath,"wb")for j in range(filelineslist[i]):line=allfile.readline()tmpfile.write(line)tmpfile.close() allfile.close()
3.將切割后兩個數據文件進行內部排序
4.將切割后的兩個文件進行歸并排序
四、對QQ數據文件進行歸并排序
之前歸并的是兩個文件,如果要是有10個文件,你怎么歸并效率最高呢?
1.如何做到兩兩歸并
我們要把列表里的第一個數還有第二個數合并放到最后一位
2.批量兩兩合并
總結
以上是生活随笔為你收集整理的大文件的切割与归并(数据分析案例三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 显卡知识简介
- 下一篇: 《了不起的盖茨比》----走出绿灯困境