[]バイトのcompressedbytes
に圧縮されたASCIIテキストのバイトを受け取りました。私が直面している問題は、次の手順では、関数が終わりに達しても解放されず、プログラムの実行時に占領されたままの大量のメモリを占有するということです。バイトで占有されたメモリを解放できません。バッファー
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()
機能を持っていますが、それらのどれもが一度占有されているメモリを解放することができないことに気づきました。
リセットは、バッファが空にリセットされますが、それは今後の書き込みで使用するための基盤となるストレージを保持し、次の
documentation
Reset()
の状態。リセットは切り捨て(0)と同じです。
バッファを解除して再度メモリを解放するにはどうすればよいですか? 私のプログラムは、実行中に約2MBのメモリが必要です。 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(os.stdout)を使用してバッファを排水については? – khrm
どのようにメモリ使用量を測定していますか? – elithrar
私は、この文の前後に一時停止(ユーザ入力を待っている)を置いて、プロセスメモリがその間で拡大するのを見ます。 SysInternals ProcessExplorerの「WorkingSetSize」列と「PrivateBytes」列でチェックします。 – JohnGalt