Skynet

          ---------- ---------- 我的新 blog : liukaiyi.cublog.cn ---------- ----------

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            112 Posts :: 1 Stories :: 49 Comments :: 0 Trackbacks


          數據說明:
          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.aygfsteel.com/Good-Game
          posted on 2009-11-23 14:43 劉凱毅 閱讀(1416) 評論(0)  編輯  收藏 所屬分類: 數據清洗

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 台山市| 岑溪市| 凤阳县| 牟定县| 邮箱| 普定县| 三门峡市| 融水| 两当县| 盐津县| 彩票| 乐平市| 隆子县| 吉林市| 乐昌市| 陆良县| 镇雄县| 屯昌县| 田林县| 黔江区| 亚东县| 唐河县| 神木县| 天等县| 依兰县| 洪泽县| 专栏| 台东市| 留坝县| 通城县| 游戏| 西和县| 仙居县| 册亨县| SHOW| 宁陵县| 成都市| 班玛县| 原平市| 乌拉特后旗| 万山特区|