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
}

questionAnswers(2)

yourAnswerToTheQuestion