数据说明:
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多分钟 。。。。。
本文转自博客园刘凯毅的博客,原文链接:大文件切割,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()
# 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倒序排列(方法比奔逸,大家可绕行),如需转载请自行联系原博主。