Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi 392Byte * 610 Datensätze = 6MB??? (https://www.delphipraxis.net/6689-392byte-%2A-610-datensaetze-%3D-6mb.html)

Blizzard 18. Jul 2003 13:33


392Byte * 610 Datensätze = 6MB???
 
Hi
ich hab in meinem prog folgende datenstruktur:

Delphi-Quellcode:
  TDataTyp=record
   ID:integer;
   Bezeichner:string[100];
   ByteCount:Byte;
   Wert:Double;
   Formel:string[50];
   Einheit:string[10];
   max,min:String[50];
   Beschreibung:string[100];
  end;
...
var
 daten:array of TDataTyp;
laut sizeof hat jedes element meines array eine große von 392 Byte was rechnerisch auch hinkommt.

Füll ich jetzt allerdings den array mit 610 datensätze ist meine exe im memory plötzlich um ca 6MB größer da ich allerdings auch für rechner mit wenig ram progge gehn die da ziemlich in die knie kann mir jemand sagen warum das ganze dann plötzlich 6MB hat und ned nur die rechnerischen 250kb und was ich dagegen tun kann? ich verstehs ned

mfg
Blizzard

P.s.: im füllbereich wird nur mit string-operationen gearbeitet also copy, pos, trim, strtoint usw

Snoop007 18. Jul 2003 13:37

Re: 392Byte * 610 Datensätze = 6MB
 
das liegt an deinem dynamischen array
immer wenn du es vergrösserst hängt delphi die daten nicht im speicher an, wo wie es in "userer" sicht aussieht, sonder resaviert neuen speicher

wenn du weisst wiviele datensätze du benutzt bzw. ein standartwert und erstelle die grösse des dynamischen arrays damit sparst du schonmal

Blizzard 18. Jul 2003 14:01

Re: 392Byte * 610 Datensätze = 6MB???
 
macht das wirklich 5MB aus?
das problem ist nämlich das ích's zur programier zeit ned weis wieviel datensätze es sind kann irgendwo zwischen 10 und 2000 schwanken :?
ich weis es frühestens wenn ich die datei zum einlesen öffne.

mfg
Blizzard

Christian Seehase 18. Jul 2003 14:14

Re: 392Byte * 610 Datensätze = 6MB???
 
Moin Blizzard,

Zitat:

Zitat von Blizzard
ich weis es frühestens wenn ich die datei zum einlesen öffne.

Und was hindert Dich daran die Grösse des Arrays dann erst zu setzen?

Ansonsten kannst Du ja einen vernünftigen Durchschnittswert für die Initialisierung nehmen, und für den Fall das der Platz nicht reicht, um einen bestimmten Wert erhöhen, nicht um 1.
Der einzige Nachteil:
Du musst noch einen Zähler auf das gerade aktive Element mitführen, da high(array) dann ja nicht der Index des letzten Elementes ist.

Snoop007 18. Jul 2003 14:21

Re: 392Byte * 610 Datensätze = 6MB???
 
wenn ich mich jetzt nicht irre ist
anzahl der arrays = dateigrösse div sizeof(TDataTyp)

gilt nur wenn du den record in die datei schreibst und keine weieten daten; ansonsten kann du einen header in die datei mit reinschreiben, welcher die anzahl der array usw. .. hat

Blizzard 18. Jul 2003 14:28

Re: 392Byte * 610 Datensätze = 6MB???
 
hab mich vielleicht etwas schlecht ausgedrück:
ich öffne die datei ermittle wieviel datensätze ich habe setze die länge des array mit setlength(daten,610) auf die anzahl der datensätze und fang dann an ihn zu füllen und bekomm trotzdem nen 6MB block :cry:

Christian Seehase 18. Jul 2003 14:32

Re: 392Byte * 610 Datensätze = 6MB???
 
Moin Blizzard,

hast Du es statt der ShortStrings mal mit HugeStrings versucht?

Snoop007 18. Jul 2003 14:34

Re: 392Byte * 610 Datensätze = 6MB???
 
ist ja komisch, ich habe deinen record mal genommen 650 einträge erstellt ( array grössenerhöhung um 1)

das test prog wurde "nur" um 1 mb grösser

Blizzard 18. Jul 2003 14:40

Re: 392Byte * 610 Datensätze = 6MB???
 
wenn du mit hugestring normal strings ohne längenangaben meinst dann jo da isses noch größer geworden.
mit widestrings hab ich's aber noch ned probiert

wenn ich den array mit setlength initialisiere da is die größe auch noch ganz ok so 1MB zunahme damit könnte ich leben. aber sobald ich ihn mit daten fülle steigt die größe komischerweise plötzlich an was ja eigentlich nicht sein dürfte

Snoop007 18. Jul 2003 14:45

Re: 392Byte * 610 Datensätze = 6MB???
 
Delphi-Quellcode:
type
  TDataTyp=record
   ID:integer;
   Bezeichner:string[100];
   ByteCount:Byte;
   Wert:Double;
   Formel:string[50];
   Einheit:string[10];
   max,min:String[50];
   Beschreibung:string[100];
  end;

procedure TForm1.Button1Click(Sender: TObject);
var
  daten : array of TDataTyp;
  i : word;
begin
  // SetLength(daten,650); // besser
  for i := 0 to 649 do
  begin
    SetLength(daten,i+1); // schlechter
    daten[i].ID := i;
    daten[i].ByteCount := 255;
    daten[i].Wert := 999999999;
    FillChar(daten[i].Bezeichner,100,char('s'));
    FillChar(daten[i].Beschreibung,100,char('s'));
    FillChar(daten[i].min,50,char('s'));
    FillChar(daten[i].max,50,char('s'));
    FillChar(daten[i].Bezeichner,10,char('s'));
  end;
  caption := daten[500].Bezeichner;
end;
ich geh jetzt davon mal aus das du es ähnlich hast, probier dennoch mal diesen code bei dir

eigendlich dürfte die grösse nicht ansteigen, da du ja schon angegeben hast wie gross der record ist ( beschränkung bei strings )


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz