Não é possível liberar memória uma vez ocupada por bytes.
Eu recebo bytes de texto ASCII compactado emcompressedbytes
do tipo [] byte. O problema que enfrento é que o procedimento a seguir ocupa muita memória que não é liberada após o término da função e permanece ocupada durante todo o tempo de execução do programa.
b := bytes.NewReader(compressedbytes)
r, err := zlib.NewReader(b)
if err != nil {
panic(err)
}
cleartext, err = ioutil.ReadAll(r)
if err != nil {
panic(err)
}
Notei que o tipo em uso ébytes.Buffer
e esse tipo tem oReset()
eTruncate()
funções, mas nenhuma delas permite liberar a memória que já foi ocupada.
odocumentação doReset()
declara o seguinte:
Redefinir redefine o buffer para ficar vazio, mas mantém o armazenamento subjacente para uso em gravações futuras. Redefinir é o mesmo que Truncar (0).
Como posso desarmar o buffer e liberar a memória novamente? Meu programa precisa de cerca de 50 MB de memória durante a execução que leva 2h. Quando importo seqüências de caracteres que são compactadas com zlib, o programa precisa de 200 MB de memória.
Obrigado pela ajuda.
=== Atualização
Eu até criei uma função separada para a descompressão e chame o coletor de lixo manualmente comruntime.GC()
após o programa retornar dessa função sem êxito.
// unpack decompresses zlib compressed bytes
func unpack(packedData []byte) []byte {
b := bytes.NewReader(packedData)
r, err := zlib.NewReader(b)
if err != nil {
panic(err)
}
cleartext, err := ioutil.ReadAll(r)
if err != nil {
panic(err)
}
r.Close()
return cleartext
}