zhangzengfei
2024-09-26 88b1f1d1d14a8fe9e3dde2f363a89d821fc0e641
cache/shardmap/shardmap.go
@@ -4,6 +4,7 @@
import (
   "basic.com/pubsub/protomsg.git"
   "sdkCompare/db"
   "sync"
   //"encoding/json"
   //"fmt"
@@ -28,7 +29,7 @@
var Count = make(chan int)
type wfOp func(a []byte, b string) float32
type wfOp func(a, b []float32) float32
/**
* @param uint8, shardCnt must be pow of two
@@ -89,74 +90,44 @@
   value interface{}
}
func (s *ShardMap) Walk(wf wfOp, sourceFea []byte, baseScore float32, isWebComp bool, target string) (targets []*protomsg.SdkCompareEach) {
func (s *ShardMap) Walk(wf wfOp, sourceFea []float32, baseScore float32) (targets []*protomsg.SdkCompareEach) {
   var wg sync.WaitGroup
   var lock sync.Mutex
   for _, si := range s.shards {
      var tempsi shardItem = *si
   for _, si := range s.shards {
      var tempsi *shardItem = si // 保持对原始 shardItem 的指针引用
      // 跳过空分片
      if len(tempsi.data) == 0 {
         continue
      }
      wg.Add(1)
      go func(st *shardItem, fw wfOp, sf []byte, baseSec float32, isWeb bool) {
      go func(st *shardItem, fn wfOp, srcFeat []float32, baseSec float32) {
         defer wg.Done()
         st.RLock()         // 锁定读取
         defer st.RUnlock() // 确保读取完毕后解锁
         for _, feature := range st.data {
            if eif, ok := feature.(*protomsg.Esinfo); ok {
               if !isWeb { //不会比对抓拍库,只比对有效的人
                  if eif.Enable == 1 {
                     score := float32(0)
                     if target == "car" {
                        if eif.CarNo != "" {
                           score = strComp(sf, eif.CarNo)
                        } else {
                           continue
                        }
                     } else {
                        score = fw(sf, eif.FaceFeature)
                     }
                     if score > 0 && score >= baseScore {
                        lock.Lock()
                        targets = append(targets, &protomsg.SdkCompareEach{
                           Id:           eif.Id,
                           CompareScore: score,
                           Tableid:      eif.Tableid,
                        })
                        lock.Unlock()
                     }
                  }
               } else { //来源是web,会比对抓拍库,不管是否有效都需要比对
                  score := float32(0)
                  if target == "car" {
                     if eif.CarNo != "" {
                        score = strComp(sf, eif.CarNo)
                     } else {
                        continue
                     }
                  } else {
                     score = fw(sf, eif.FaceFeature)
                  }
                  if score > 0 && score >= baseScore {
                     lock.Lock()
                     targets = append(targets, &protomsg.SdkCompareEach{
                        Id:           eif.Id,
                        CompareScore: score,
                        Tableid:      eif.Tableid,
                     })
                     lock.Unlock()
                  }
            // 读取操作在锁内进行,防止并发冲突
            if item, ok := feature.(*db.FeatureCacheBase); ok {
               score := fn(srcFeat, item.FaceFeature)
               if score > 0 && score >= baseScore {
                  lock.Lock() // 保护目标切片的写入
                  targets = append(targets, &protomsg.SdkCompareEach{
                     Id:           item.Id,
                     CompareScore: score,
                     Tableid:      item.TableId,
                  })
                  lock.Unlock()
               }
            }
         }
      }(&tempsi, wf, sourceFea, baseScore, isWebComp)
      }(tempsi, wf, sourceFea, baseScore)
   }
   wg.Wait()
   return targets
}
// print all