我收到压缩的ASCII文本字节,存放在类型为[]byte的compressedbytes
中。我面临的问题是,在函数结束后,下面的过程会占用大量内存,并且在程序运行时保持占用状态。
b := bytes.NewReader(compressedbytes)
r, err := zlib.NewReader(b)
if err != nil {
panic(err)
}
cleartext, err = ioutil.ReadAll(r)
if err != nil {
panic(err)
}
我注意到正在使用的类型是bytes.Buffer
,这种类型具有Reset()
和Truncate()
函数,但它们都不允许释放一次占用的内存。
Reset()的文档如下:
Reset将缓冲区重置为空,但保留底层存储以供将来写入使用。Reset与Truncate(0)相同。
我该如何取消设置缓冲区并再次释放内存? 我的程序在运行时需要大约50MB的内存,运行时间为2小时。当我导入zlib压缩的字符串时,程序需要200 MB的内存。
感谢您的帮助。
=== 更新
我甚至为解压缩创建了一个单独的函数,并在程序从该函数返回后手动调用垃圾收集器runtime.GC()
,但没有成功。
// 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
}
b.WriteTo(ioutil.Discard)
,但没有成功。 - JohnGalt