Ich erhalte Bytes komprimierten ASCII-Text in compressedbytes
vom Typ [] Byte. Das Problem, dem ich gegenüberstehe, ist, dass die folgende Prozedur viel Speicher belegt, der nicht freigegeben wird, nachdem die Funktion ihr Ende erreicht hat und während der gesamten Laufzeit des Programms belegt bleibt.Speicher kann nicht einmal durch Bytes belegt werden.Buffer
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 die Art in Gebrauch ist bytes.Buffer
und diese Art hat die Reset()
und Truncate()
Funktionen, aber keiner von ihnen ermöglicht, den Speicher freizugeben, die einmal besetzt ist.
Die documentation von Reset()
besagt Folgendes:
Zurücksetzen Damit wird der Puffer leer sein, aber es behält den zugrunde liegenden Speicher für die Nutzung durch zukünftige schreibt. Zurücksetzen ist dasselbe wie Abschneiden (0).
Wie kann ich den Puffer aufheben und den Speicher wieder freigeben? Mein Programm benötigt ca. 50 MB Arbeitsspeicher während des Laufs, der 2 Stunden dauert. Wenn ich Zeichenfolgen importiere, die zlib komprimiert sind, benötigt das Programm 200 MB Speicher.
Danke für Ihre Hilfe.
=== Update-
Ich habe sogar eine eigene Funktion für die Dekompression und der Garbage Collector mit runtime.GC()
nach kehrt das Programm von dieser Funktion ohne Erfolg manuell aufrufen.
Was den Puffer mit b.WriteTo (os.stdout Trockenlegung)? – khrm
Wie messen Sie die Speichernutzung? – elithrar
Ich habe vor und nach dieser Anweisung eine Pause eingelegt (warten auf Benutzereingaben) und beobachten, wie der Prozessspeicher dazwischen wächst. Ich überprüfe es in SysInternals ProcessExplorer in Spalte "WorkingSetSize" und "PrivateBytes". – JohnGalt