2017-08-04 61 views
2

我正在使用以下功能下載小於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在被另一個函數處理後使用的內存,因此內存使用量不會大於當前正在處理的字節數?

回答

6

首先,我建議閱讀下列問題/回答:

FreeOSMemory() in production

Golang - Cannot free memory once occupied by bytes.Buffer

你可能觸發GC來釋放未使用的對象與runtime.GC(),你可以督促你的Go運行時釋放內存回到操作系統debug.FreeOSMemory(),但所有這些只是消防。一個寫得好的Go應用程序不應該調用這些。

你應該做的是防止運行時分配大量的內存。

你會怎麼做到這一點?一些手段(你甚至可以結合這些解決方案):