Nicht der freie Speicher einmal besetzt von bytes.Puffer

Erhalte ich die bytes des komprimierten ASCII-text in compressedbytes Typ []byte. Das problem, das ich konfrontiert ist, dass Sie die folgende Prozedur nimmt viel Speicher, der nicht freigegeben, wenn die Funktion bis zum Ende und bleibt besetzt, die während der gesamten Laufzeit des Programms.

    b := bytes.NewReader(compressedbytes)
    r, err := zlib.NewReader(b)
    if err != nil {
        panic(err)
    }
    cleartext, err = ioutil.ReadAll(r)
    if err != nil {
        panic(err)
    }

Bemerkte ich, dass der Typ in Gebrauch ist bytes.Buffer und dieser Typ hat die Reset() und Truncate() Funktionen, aber keiner von Ihnen ermöglicht, den Speicher frei, das ist einmal belegt.

Den Dokumentation von Reset() besagt Folgendes:

Reset setzt den Puffer leer zu sein, aber es behält den zugrunde liegenden Speicher für die Nutzung von Zukunft schreibt. Reset ist das gleiche wie Truncate(0).

Wie kann ich entfernt den Puffer und den freien Speicher wieder auf?
Mein Programm benötigt etwa 50 MB Speicher, während das laufen, das dauert 2h. Wenn ich importieren, die Zeichenfolgen, die die zlib-komprimiert das Programm benötigt 200 MB Speicher.

Vielen Dank für Ihre Hilfe.

=== Update

Ich auch eine separate Funktion für die Dekompression und rufen Sie den garbage collector manuell mit runtime.GC() nach dem Programm gibt aus, dass die Funktion ohne Erfolg.

//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
}
  • Was über die Entwässerung der Puffer mit b.Writecontentto(os.stdout) ?
  • Wie sind Sie mit der Messung der Speicherauslastung?
  • Ich legte eine pause (warten auf eine Benutzereingabe) vor und nach dieser Aussage und beobachten Sie den Prozess-Speicher dazwischen wachsen. Ich schau es im SysInternals ProcessExplorer in der Spalte "WorkingSetSize" und "PrivateBytes".
  • Dank khrm, gute Idee - ich habe versucht, hinzufügen b.WriteTo(ioutil.Discard) ohne Erfolg.
  • Dies ist nicht der richtige Weg, um zu überprüfen, wenn der Speicher gesammelt werden, der GC. Aufhören, sich sorgen. Der GC speichert ungenutzte Speicher und möglicherweise oder möglicherweise nicht es zurück zu dem OS was in Ordnung ist.
InformationsquelleAutor JohnGalt | 2016-05-23
Schreibe einen Kommentar