main.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. package main
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/importcjj/sensitive"
  6. "go.mongodb.org/mongo-driver/bson/primitive"
  7. "google.golang.org/grpc"
  8. "gopkg.in/yaml.v3"
  9. "io/ioutil"
  10. "log"
  11. "net"
  12. "runtime"
  13. "sensitiveWords.udp/proto_grpc"
  14. "sensitiveWords.udp/util"
  15. "strings"
  16. "time"
  17. )
  18. const (
  19. PORT = ":50051"
  20. YAMLFILE = "./server.yaml"
  21. )
  22. var YamlConfig YAMLConfig
  23. var MixDataMgo *util.MongodbSim
  24. var Filter *sensitive.Filter
  25. func init() {
  26. yamlFile, err := ioutil.ReadFile(YAMLFILE)
  27. if err != nil {
  28. log.Fatalln("load conf error")
  29. }
  30. err = yaml.Unmarshal(yamlFile, &YamlConfig)
  31. if err != nil {
  32. fmt.Println(err.Error())
  33. }
  34. log.Printf("%#v", YamlConfig)
  35. MixDataMgo = &util.MongodbSim{
  36. MongodbAddr: YamlConfig.MixdataMgoAddr,
  37. Size: YamlConfig.MongodbPoolSize,
  38. DbName: YamlConfig.DbName,
  39. UserName: YamlConfig.UserName,
  40. PassWord: YamlConfig.PassWord,
  41. }
  42. MixDataMgo.InitPool()
  43. gteid, err := primitive.ObjectIDFromHex(YamlConfig.TaskGteId)
  44. if err != nil {
  45. log.Fatalln(err)
  46. }
  47. lteid, err := primitive.ObjectIDFromHex(YamlConfig.TaskLteId)
  48. if err != nil {
  49. log.Fatalln(err)
  50. }
  51. iter := MixDataMgo.GetMgoConn().C("unique_qyxy").Find(map[string]interface{}{
  52. "_id": map[string]interface{}{
  53. "$gte": gteid,
  54. "$lte": lteid,
  55. },
  56. }).Sort("_id").Iter()
  57. Filter = sensitive.New()
  58. var initnum uint
  59. saveIdArr ,start_id:= make([]map[string]string,0),""
  60. var m runtime.MemStats
  61. for tmp := map[string]interface{}{}; iter.Next(&tmp); tmp = map[string]interface{}{} {
  62. if start_id=="" {
  63. start_id = BsonTOStringId(tmp["_id"])
  64. }
  65. Filter.AddWord(tmp["qy_name"].(string))
  66. initnum++
  67. if initnum%10000==0 {
  68. runtime.ReadMemStats(&m)
  69. men :=toMegaBytes(m.HeapAlloc)
  70. log.Printf("current index %d\tos %.2f M",initnum, men)
  71. if men>500 {
  72. saveIdArr = append(saveIdArr, map[string]string{
  73. "start":start_id,
  74. "end":BsonTOStringId(tmp["_id"]),
  75. })
  76. runtime.GC()
  77. Filter = sensitive.New()
  78. start_id = ""
  79. time.Sleep(time.Second*5)
  80. }
  81. }
  82. break
  83. }
  84. saveIdArr = append(saveIdArr, map[string]string{
  85. "start":start_id,
  86. "end":"",
  87. })
  88. for k,v:=range saveIdArr{
  89. log.Println("第",k,"段",v["start"],v["end"])
  90. }
  91. log.Println("init ok", initnum)
  92. }
  93. func toMegaBytes(bytes uint64) float64 {
  94. return float64(bytes) / 1024 / 1024
  95. }
  96. func main() {
  97. lis, err := net.Listen("tcp", PORT)
  98. if err != nil {
  99. log.Fatalf("failed to listen: %v", err)
  100. }
  101. s := grpc.NewServer()
  102. proto_grpc.RegisterSensitiveWordsServer(s, &server{})
  103. log.Println("server start:", PORT)
  104. if err := s.Serve(lis); err != nil {
  105. log.Fatalf("failed to serve: %v", err)
  106. }
  107. }
  108. type server struct {
  109. proto_grpc.SensitiveWordsServer
  110. }
  111. func (s *server) Search(ctx context.Context, in *proto_grpc.Request) (*proto_grpc.ResultSensitiveWords, error) {
  112. text := in.GetText()
  113. log.Println(text)
  114. findAll := Filter.FindAll(text)
  115. return &proto_grpc.ResultSensitiveWords{SensitiveWords: strings.Join(findAll, ",")}, nil
  116. }
  117. type YAMLConfig struct {
  118. MixdataMgoAddr string `yaml:"mixdataMgoAddr"`
  119. UserName string `yaml:"userName"`
  120. PassWord string `yaml:"passWord"`
  121. DbName string `yaml:"dbName"`
  122. MongodbPoolSize int `yaml:"mongodbPoolSize"`
  123. TaskGteId string `yaml:"taskGteId"`
  124. TaskLteId string `yaml:"taskLteId"`
  125. }
  126. func StringTOBsonId(id string) primitive.ObjectID {
  127. objectId, _ := primitive.ObjectIDFromHex(id)
  128. return objectId
  129. }
  130. func BsonTOStringId(id interface{}) string {
  131. return id.(primitive.ObjectID).Hex()
  132. }