首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用goroutines修复go程序的内存消耗

使用goroutines修复go程序的内存消耗
EN

Stack Overflow用户
提问于 2021-06-25 02:46:19
回答 1查看 118关注 0票数 0

我正在处理一个涉及生产者-消费者模式的问题。我有一个生产者来产生任务,'n‘个消费者来消费任务。使用者任务是从文件中读取一些数据,然后将这些数据上传到S3。一个消费者可以读取高达xMB(8/16/32)的数据,然后将其上传到s3。将所有数据保存在内存中会导致内存消耗超过程序的预期,所以我切换到从文件中读取数据,然后将其写入某个临时文件,然后将文件上传到S3,虽然这种方法在内存方面表现更好,但CPU受到了影响。我想知道是否有办法一次分配固定大小的内存,然后在不同的goroutines之间使用它?我想要的是,如果我有4个goroutine,那么我可以分配4个不同的xMB数组,然后在每个goroutine调用中使用相同的数组,这样goroutine就不会每次都分配内存,也不需要依赖GC来释放内存?

编辑:添加我的代码的症结。我的go消费者如下所示:

代码语言:javascript
复制
type struct Block {
   offset int64
   size int64
}

func consumer (blocks []Block) {
   var dataArr []byte
   for _, block := range blocks {
      data := file.Read(block.offset, block.size)
      dataArr = append(dataArr, data)
   }
   upload(dataArr)  
}

我是基于块从文件中读取数据的,这个块可以包含几个受xMB限制的小块,也可以包含一个大的xMB块。

Edit2:根据评论中的建议试用了sync.Pool。但我没有看到内存消耗有任何改善。我做错了什么吗?

代码语言:javascript
复制
var pool *sync.Pool
func main() {
  pool = &sync.Pool{
    New: func()interface{} {
        return make([]byte, 16777216)
    },
  }
  for i:=0; i < 4; i++ {
     // blocks is 2-d array each index contains array of blocks.
     go consumer(blocks[i])
  }
 
}
  
go consumer(blocks []Blocks) {
    var dataArr []byte
    d := pool.(Get).([]byte)
    for _, block := range blocks {
     file.Read(block.offset,block.size,d[block.offset:block.size])
    }
    upload(data)  
    pool.put(data)
}
EN

回答 1

Stack Overflow用户

发布于 2021-06-27 10:13:51

看看SA6002 of StaticCheck,关于sync.Pool。您也可以使用pprof工具。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68121245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档