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连接. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |