Dies ist ein C# -Problem. Ich habe zu einer bestimmten Zeit ein großes Objekt im Gedächtnis. Ich möchte es in eine Datei serialisieren. Es gibt zwei Schritte, um es zu tun. 1. Ich muss das Objekt in CSV-String ändern. 2. Ich muss die CSV-Zeichenfolge serialisieren.Wie kann der Speicherverbrauch reduziert werden?
Ich habe ein Dienstprogramm, das Zeichenfolgen an einen MemoryStream anhängen kann. Ich benutze dieses Hilfsprogramm, um das große Objekt in eine CSV-Zeichenfolge (in einem großen Stamm von MemoryStream) zu konvertieren. Nachdem das große Objekt in einen MemoryStream konvertiert wurde, erstelle ich einen StreamReader des MemoryStream und rufe seine Methode StreamReader.ReadToEnd() auf, um den MemoryStream in eine (lange) Zeichenkette umzuwandeln. Dann rufe ich info.AddValue ("BigObject", String) auf; um die Zeichenfolge zu serialisieren.
Wie man sehen kann, werde ich in der Erinnerung tatsächlich drei Kopien des großen Objekts halten. Der erste ist das Objekt selbst, der zweite ist der MemoryStream, der den csv-String enthält, und der dritte ist der String, der eigentlich ein redundanter MemoryStream ist.
Gibt es eine Möglichkeit, den Speicherverbrauch in diesem Verfahren zu reduzieren? Es scheint, dass, wenn nicht MemoryStream, ich sowieso einen StringBuilder verwenden muss, um die CSV-Zeichenfolge des großen Objekts zu halten, und ich muss StringBuilder.ToString() aufrufen, um die letzte Zeichenfolge zu erhalten. Dann werden die letzte Zeichenfolge und der StringBuilder im Speicher nebeneinander vorhanden sein und die gleiche Menge an Speicher verbrauchen wie derzeit der MemoryStream und die Zeichenfolge.
Jede Idee ist willkommen. Vielen Dank.
Ich glaube nicht, dass 'StringBuilder.ToString()' tatsächlich eine separat zugewiesene Zeichenfolge zurückgibt, so dass Sie mindestens eine Kopie speichern würde. – jerryjvl
Wie groß sind diese großen Objekte übrigens? ... wenn es über die magische (aktuelle) Grenze von 85KB hinausgeht, haben Sie möglicherweise andere Probleme, die sich auf die Speicherfragmentierung beziehen. – jerryjvl
jerryvl, du hast Recht, dass es keine neue Zeichenfolge kopiert. Die Zeichenfolge wird jedoch intern neu zugewiesen, wenn sie ihr Limit überschreitet, indem ein Doubling-Algorithmus verwendet wird. Also, wenn ich meine Mathe richtig verstanden habe, wird es in der Lage sein, doppelt so viel Speicher zuzuweisen wie die Zeichenfolge, die es zurückgibt, in Stücken verschiedener Größen. –