数据说明: 
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()
                                                                                                                                                                         
整理 www.blogjava.net/Good-Game