大文件切割,top倒序排列(方法比奔逸,大家可绕行)

数据说明: 
knnuu_...txt 文件大小 3.2G 数据格式是  
user1   user2    score
..
usern   userm    score
我这里希望通过清洗得到:
与 user1 关系最近的 top 100 人
由于数据并非需要百分之百准确,我放弃在分隔出的数据
if len(dr)!=3  : continue
开了 7 个线程 也就是 会有 7 个 用户 的  uid 对 top 100 uid 会出现问题 
对应  总用户数几十万来说  呵呵 ! 我就用这 完善7个特殊人的列表时间写个 blog 吧
并结合 linux split , awk 等 快速实现的 猥琐 多线程 哈哈!!
怎么修改下  速度提升 5倍,原来的 一小时 到 10多分钟 。。。。。

#  split  --bytes=500m  knnuu_20091123.txt knnuu/
#
 ls a* | awk '{system( "  python uu.py "$0" & " )}'
import  bsddb,sys
db 
=  bsddb.hashopen( ' ../id-item-y-09-10-11.db ' , ' c ' )

uid 
=   - 1
arr
= []
arrsc
= []
fw 
=  open( ' tc/ ' + sys.argv[ 1 ] + ' uid-uid-sc.txt ' , ' w ' )
ii
= 0

def  insertion_sort(arr,arrsc,uid,sc):
    ls 
=  min( 100 ,len(arrsc))
    if ls!=0 and sc < arrsc[ls-1] : return 
    
for  i  in  xrange(ls):
        
if  arrsc[i] <= sc  :
            arrsc.insert(i,sc)
            arr.insert(i,uid)
            
return
        
elif  arrsc[i]  >  sc :   continue
    
if  ls  <   99  :
        arr.append(uid)
        arrsc.append(sc)

# for row in open('knnuu_20091123.txt') :
for  row  in  open(sys.argv[ 1 ]):
    dr 
=  row.split( ' \n ' )[0].split( ' \t ' )
    
if  len(dr) != 3  :  continue
    u1,u2,strsc 
=  dr[0],dr[ 1 ],dr[ 2 ]

    sc 
=  float(strsc)
    
if  uid  ==   - 1  : uid  =  u1
    
if  u1  !=  uid :
        
for  c  in  xrange( min( 100 ,len(arrsc)) ):
            tu 
=  arr[c]
            ts 
=  arrsc[c]
            
print   >> fw, " %s\t%s\t%s "   %  ( db[u1],db[tu],ts )
        
print  uid
        fw.flush()
        arr
= [u1]
        arrsc
= [sc]
        uid
= u1
    
else  :
        insertion_sort(arr,arrsc,u2,sc)
    ii
+= 1
    
# print ii,u1,uid,u2,strsc,len(arr),len(arrsc)
     # if ii>10 : break

fw.close()
                                                                                                                                                                         

本文转自博客园刘凯毅的博客,原文链接:大文件切割,top倒序排列(方法比奔逸,大家可绕行),如需转载请自行联系原博主。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值