当前位置: 首页 > 面试题库 >

io.copy原因导致golang内存不足

汝开畅
2023-03-14
问题内容

我使用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, err := bodyWriter.CreateFormFile(paramName, fileName) // out of memory
if err != nil {
    return nil, err
}

问题答案:

这是因为您正在“复制”到bodyBuf,这是内存中的缓冲区,从而迫使Go尝试分配与整个文件一样大的内存块。

根据您的使用情况,multipart您似乎正在尝试通过HTTP流式传输文件?在这种情况下,请勿将传递bytes.Buffermultipart.NewWriter,而是直接传递您的http连接。



 类似资料:
  • 问题内容: 我想将文件从一个地方复制到另一个地方,问题是我处理了很多稀疏文件。 有什么(简单的)复制稀疏文件而不会在目标位置变得庞大的方法? 我的基本代码: 问题答案: 一些背景理论 请注意,通过管道传输原始字节–一旦您认为将原始数据通过管道从到提供和的,就可以理解。这样,绝对可以处理提供字节的任何源以及使用它们的任何接收器。 另一方面,文件中漏洞的位置是“侧通道”信息,这些“侧通道”信息是“经典

  • 问题内容: 我在自己的环境中不断检测PermGen中的OOM: Java 6的 jboss-4.2.3 网络应用程序不大 我知道String.intern()问题-但是我没有足够有价值的用法。MaxPermGen大小的增加并没有费力(从128 Mb到256 Mb)。 还有什么其他原因可以为PermGen调用OOM?在这种情况下(策略,工具等)哪种调查方案是最佳的? 谢谢你的帮助 问题答案: 看到这

  • 问题基于Oracle Hotspot JDK8。 我想,当应用程序遇到异常时,可能有两个原因。 分配的JVM堆大小达到指定大小,GC系统无法挤出足够的空间。 分配的JVM堆没有到达,但是没有足够的物理内存使JVM堆增长。假设<. 我用@Eugene在Answer中提供的代码做了一些实验。正如@Holger所指出的,结果在不同的环境中有所不同。我使用Hotspot JDK8 x64在CentOS x

  • 我使用mockito 1.8.3、jacoco 0.72和maven 3.0.5 surefire插件(2.12.4)来执行单元测试并生成覆盖报告,它运行良好。 随着越来越多的测试被添加,它开始不工作。在测试执行过程中,我不断地遇到内存不足的错误,并且无法找到一种方法来找出问题所在。

  • 一个简单的网页请求总是报错:favicon.ico文件不存在。 我在apache的根目录中放置了一个图片文件 favicon.ico,故障消失。 我找了一些资料: 因为现在的浏览器都或第三方程序都会默认请求favicon.ico图标,如果没有就会报404错误。 请问,为何浏览器或第三方要请求这个东东?不请求不行吗?

  • 我想首先说,这是我第一次必须处理性能,因为这是我第一次开发一个android应用程序。 该应用程序是一个源代码编辑器,在这里你可以打开文件,修改它们,并将它们保存回来。该应用程序由4个部分组成: 导航器视图:包含打开文件的ListView和打开文件夹的TreeView。 代码视图容器:它保存包含实际代码的视图。 代码容器:这是一个小视图,包含一个文本视图和一个自定义EditText(由我扩展Edi