Du kannst ja grob schätzen?
Größe = Anzahl der Knoten * MagischeZahl
Aber statt Size würde ich eher das geheime Capacity setzen, oder du mußt den Stream, am Ende des Schreibvorgangs vom Tree, auf die korrekte Größe setzen.
Delphi-Quellcode:
MS.Size := 666;
VT.SaveToStream(MS);
MS.Size := MS.Position;
Delphi-Quellcode:
type
TMemoryStreamHack = class(TMemoryStream)
property Capacity;
end;
TMemoryStreamHack(MS).Capacity:= 666; // oder direkt den Stream über diese Klasse erzeugen
VT.SaveToStream(MS);
Aber paß auf, daß du Capacity nicht kleiner als das aktuelle Size setze, sonst verschwinden schnell mal ein paar Daten.
Hmm, grade nchgesehn, uch in D7 wurde TMemoryStream schon optimiert, so daß nur in 8 KB-Schritten der Speicher vergrößert wird ... sind aber dennoch fast 2200 Größenänderungen und somit genut Anfagen an den Speichermanager.
Falls ich mich nicht verschrieben hab ... arbeitet in größeren Schritten
Delphi-Quellcode:
type
TMyMemoryStream = class(TMemoryStream)
protected
function Realloc(var NewCapacity: LongInt): Pointer; override;
public
procedure SetCapacity(Value: LongInt);
end;
function TMyMemoryStream.Realloc(var NewCapacity: LongInt): Pointer;
begin
if NewCapacity > Capacity then begin
if NewCapacity <= 2 shl 20 then // kleiner 2 MB
inherited Realloc((NewCapacity + (1 shl 19 - 1)) and not (1 shl 19 - 1)); // 0.5 MB-Schritte
else
inherited Realloc((NewCapacity + (4 shl 20 - 1)) and not (4 shl 20 - 1)); // 4 MB-Schritte
end else
inherited;
end;
procedure TMyMemoryStream.SetCapacity(Value: LongInt);
begin
if Value > Size then
Capacity := Value;
end;