我正在使用以下功能下载小于20MB的文件。它将全部内容读取到内存中,因为另一个功能必须先对字节执行工作,然后才能将其写入磁盘。
func getURL(url string) ([]byte, error) { resp, err := http.Get(url) if err != nil { return nil, fmt.Errorf("getURL: %s", err) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { return nil, fmt.Errorf("getURL: %s", err) } return body, nil }
这可以正常工作,但是所有内存都在系统上消耗了。
是否可以在body其他功能处理完之后释放使用的内存,以使内存使用量不会大于当前正在处理的字节数?
body
您可能会触发gc使用释放未使用的对象,runtime.GC()并且可能敦促Go运行时使用释放内存到OS debug.FreeOSMemory(),但是所有这些都只是在扑救。编写良好的Go应用程序永远不必调用它们。
runtime.GC()
debug.FreeOSMemory()
您应该做的是防止运行时不得不分配大量内存。
io.Reader
resp.Body
io.Pipe()
io.TeeReader()