package cache import ( "flag" "fmt" "time" "sync" "encoding/base64" "encoding/json" "basic.com/pubsub/cache.git/esutil" "basic.com/pubsub/cache.git/shardmap" "basic.com/valib/gosdk.git" ) var querynum = flag.Int("querynum", 10, "the query number from database") var threadnum = flag.Int("threadnum",32, "the number of thread to deal data.") type CmapItem struct { sync.Mutex cam map[string]*shardmap.ShardMap } var Cmap *CmapItem func Init(){ flag.Parse() gosdk.InitFaceExtractor(16, 0) Cmap = &CmapItem{ cam: make(map[string]*shardmap.ShardMap), } temptime := time.Now() var wg sync.WaitGroup for i:=0; i<*threadnum; i++ { j := i*(*querynum) wg.Add(1) go func(qs int){ defer wg.Done() escache, err := esutil.DbPersoninfos(qs, *querynum) if err != nil { fmt.Println(err) return } Cmap.Lock() for _, value := range escache{ if _, ok :=Cmap.cam[value.Tableid]; !ok { Cmap.cam[value.Tableid]=shardmap.New(uint8(*threadnum)) } Cmap.cam[value.Tableid].Set(value.Id,value.FaceFeature) } Cmap.Unlock() }(j) } wg.Wait() fmt.Println("time of get data from es.", time.Since(temptime)) fmt.Println() } func Getdbpersonmsg(tableid string, teststring []byte, IsCompare bool) ([]byte) { totalmap := make(map[string]float32) if !IsCompare { return nil } if teststring == nil { return nil } if tableid == "" { for id, val := range Cmap.cam{ fmt.Println("the id is: ", id) tmpmap := val.Walk(Printest, teststring) for key, sec := range tmpmap { totalmap[key] = sec } } }else{ for id, value := range Cmap.cam{ if id == tableid{ fmt.Println("the id is: ", id) tmpmap :=value.Walk(Printest, teststring) for key, sec := range tmpmap { totalmap[key]= sec } break } } } firsttime := time.Now() fmt.Println(time.Since(firsttime)) buf, err := json.Marshal(totalmap) if err != nil { fmt.Println("map to json error!", err) return nil } return buf } func Printest(ci []byte, co string ) (float32){ co_d, err := base64.StdEncoding.DecodeString(co) if err != nil { fmt.Println("co_d : error : ", err) return -1 } sec := gosdk.FaceCompare(ci, co_d) return sec }