clearmem.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package main
  2. import (
  3. "log"
  4. "github.com/robfig/cron"
  5. )
  6. //定时清理内存
  7. //当前位置时间,小于此时间超过6个月,则清理
  8. var currentTime = int64(0)
  9. var validTime = int64(6 * 30 * 86400)
  10. func clearMem() {
  11. c := cron.New()
  12. c.AddFunc("50 0/3 * * * *", func() {
  13. findLock.Lock()
  14. defer findLock.Unlock()
  15. wg.Wait()
  16. //遍历id
  17. AllIdsMapLock.Lock()
  18. defer AllIdsMapLock.Unlock()
  19. clearNum := 0
  20. for k, v := range AllIdsMap2 {
  21. if currentTime-v.lastTime > validTime {
  22. clearNum++
  23. //删除id的map
  24. delete(AllIdsMap2, k)
  25. //删除pb
  26. if v.P.Buyer != "" {
  27. ids := mapPb[v.P.Buyer]
  28. if ids != nil {
  29. ids.Lock.Lock()
  30. ids.Arr = deleteSlice(ids.Arr, k)
  31. if len(ids.Arr) == 0 {
  32. delete(mapPb, v.P.Buyer)
  33. }
  34. ids.Lock.Unlock()
  35. }
  36. }
  37. //删除mapPn
  38. for _, vn := range append([]string{v.P.ProjectName}, v.P.MPN...) {
  39. if vn != "" {
  40. ids := mapPn[vn]
  41. if ids != nil {
  42. ids.Lock.Lock()
  43. ids.Arr = deleteSlice(ids.Arr, k)
  44. if len(ids.Arr) == 0 {
  45. delete(mapPn, vn)
  46. }
  47. ids.Lock.Unlock()
  48. }
  49. }
  50. }
  51. //删除mapPc
  52. for _, vn := range append([]string{v.P.ProjectCode}, v.P.MPC...) {
  53. if vn != "" {
  54. ids := mapPc[vn]
  55. if ids != nil {
  56. ids.Lock.Lock()
  57. ids.Arr = deleteSlice(ids.Arr, k)
  58. if len(ids.Arr) == 0 {
  59. delete(mapPc, vn)
  60. }
  61. ids.Lock.Unlock()
  62. }
  63. }
  64. }
  65. v = nil
  66. }
  67. }
  68. log.Println("清除完成:", clearNum, len(AllIdsMap2))
  69. })
  70. c.Start()
  71. defer c.Stop()
  72. select {}
  73. }
  74. func deleteSlice(arr []string, v string) []string {
  75. j := 0
  76. for _, v1 := range arr {
  77. if v1 != v {
  78. arr[j] = v1
  79. }
  80. }
  81. return arr[:j]
  82. }