Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: VirtualTree und MemoryStream

  Alt 14. Dez 2011, 19:01
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;
$2B or not $2B
  Mit Zitat antworten Zitat