加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

io.Copy导致golang内存不足

发布时间:2020-12-16 09:24:27 所属栏目:大数据 来源:网络整理
导读:我使用io.Copy()来复制一个大约700Mb的文件,但它会导致内存不足 bodyBuf := bytes.Buffer{}bodyWriter := multipart.NewWriter(bodyBuf)//key stepfileWriter,err := bodyWriter.CreateFormFile(paramName,fileName)if err != nil { return nil,err}file,err
我使用io.Copy()来复制一个大约700Mb的文件,但它会导致内存不足

bodyBuf := &bytes.Buffer{}
bodyWriter := multipart.NewWriter(bodyBuf)

//key step
fileWriter,err := bodyWriter.CreateFormFile(paramName,fileName)
if err != nil {
    return nil,err
}

file,err := os.Open(fileName) //the file size is about 700Mb
if err != nil {
    return nil,err
}
defer file.Close()

//iocopy
copyLen,err := io.Copy(fileWriter,file) // this cause out of memory
if err != nil {
    fmt.Println("io.copy(): ",err)

    return nil,err
}

错误消息如下:

runtime: memory allocated by OS (0x752cf000) not in usable range [0x18700000,0x98700000)
runtime: out of memory: cannot allocate 1080229888-byte block (1081212928 in use)
fatal error: out of memory

我为buf分配了足够的内存,导致bodyWriter.CreateFormFile()内存不足

buf := make([]byte,766509056)
bodyBuf := bytes.NewBuffer(buf)
bodyWriter := multipart.NewWriter(bodyBuf)

fileWriter,fileName) // out of memory
if err != nil {
    return nil,err
}

解决方法

那是因为你正在’复制’到bodyBuf,这是一个内存缓冲区,迫使Go尝试分配一个与整个文件一样大的内存块.

基于你对multipart的使用,看起来你正试图通过http流式传输文件?在这种情况下,不要将bytes.Buffer传递给multipart.NewWriter,而是直接传递您的http连接.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读