ZBLOG

fastDatasetList := make([]dataset.Dataset, 0, len(datasetIdMap)) // 相关的数据集 slowDatasetList := make([]dataset.Dataset, 0, int(datasetCount)-len(datasetIdMap)) // 非相关数据集按创建时间排序 for _, datasetObj := range datasetObjList { dataC...

可以对该代码进行以下优化:

  1. 在循环内部将 datasetInfo 初始化为指针类型,以避免在追加到切片中时发生值拷贝。

  2. 使用并发 goroutine 的方式去处理每个 datasetObj,可以提高 CPU 利用率和程序的执行速度。

  3. 对于快速的数据集属性列表,可以使用 sync.Map 来存储。因为这是并发安全的。

下面是优化后的代码示例:

  1. var fastDatasetList []*dataset.Dataset
  2. slowDatasetChan := make(chan *dataset.Dataset, int(datasetCount)-len(datasetIdMap))
  3. // 存储数据集信息的临时 map
  4. datasetInfoMap := &sync.Map{}
  5. var wg sync.WaitGroup
  6. for _, datasetObj := range datasetObjList {
  7. wg.Add(1)
  8. go func(datasetObj *citadel.Dataset) {
  9. defer wg.Done()
  10. dataCount, err := citadel.CountDataset(l.ctx, l.svcCtx, datasetObj.DatasetID)
  11. if err != nil {
  12. err = code.WithCodeMsg(code.Internal)
  13. return
  14. }
  15. datasetInfoPtr := &dataset.Dataset{
  16. ID: citadel.StringFromId(datasetObj.DatasetID),
  17. Name: datasetObj.Name,
  18. ParsePdf: datasetObj.ParsePdf,
  19. CreateAt: datasetObj.CreateAt.UTC().Unix(),
  20. UpdateAt: datasetObj.UpdateAt.UTC().Unix(),
  21. Note: datasetObj.Note,
  22. Count: dataset.DatasetCount{
  23. Total: int(dataCount.Total),
  24. Labeled: int(dataCount.Labeled),
  25. Classified: int(dataCount.Classified),
  26. Synthetic: int(dataCount.Synthetic),
  27. },
  28. }
  29. _ = json.Unmarshal(datasetObj.Configure, &datasetInfoPtr.Configure)
  30. // 存储快速的数据集属性列表
  31. if _, ok := datasetIdMap[datasetObj.DatasetID]; ok {
  32. datasetInfoMap.Store(datasetObj.DatasetID, datasetInfoPtr)
  33. } else {
  34. // 通过通道将非快速数据集属性列表追加到切片中
  35. slowDatasetChan <- datasetInfoPtr
  36. }
  37. }(datasetObj)
  38. }
  39. // 等待所有 goroutine 执行完成
  40. wg.Wait()
  41. // 遍历存储快速数据集属性列表的临时 map
  42. datasetInfoMap.Range(func(key, value interface{}) bool {
  43. fastDatasetList = append(fastDatasetList, value.(*dataset.Dataset))
  44. return true
  45. })
  46. // 关闭通道,以便处理器知道没有更多数据需要接收
  47. close(slowDatasetChan)
  48. // 迭代通道来收集慢速数据集属性列表
  49. for datasetInfoPtr := range slowDatasetChan {
  50. slowDatasetList = append(slowDatasetList, *datasetInfoPtr)
  51. }

在这个例子中,我们使用了一个临时的 sync.Map,存储快速数据集属性列表。这可以避免多次增量地向切片追加数据,因为这会导致切片的重新分配和拷贝。

通过并发 goroutine 的方式去处理每个 datasetObj,我们可以同时处理多个任务,并减少总执行时间。使用通道来收集非快速数据集属性列表也是一种有效的方法,它可以防止 goroutine 因为无法写入数据而被阻塞。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=226

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?