![]() |
392Byte * 610 Datensätze = 6MB???
Hi
ich hab in meinem prog folgende datenstruktur:
Delphi-Quellcode:
laut sizeof hat jedes element meines array eine große von 392 Byte was rechnerisch auch hinkommt.
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; 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 |
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 |
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 |
Re: 392Byte * 610 Datensätze = 6MB???
Moin Blizzard,
Zitat:
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. |
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 |
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: |
Re: 392Byte * 610 Datensätze = 6MB???
Moin Blizzard,
hast Du es statt der ShortStrings mal mit HugeStrings versucht? |
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 |
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 |
Re: 392Byte * 610 Datensätze = 6MB???
Delphi-Quellcode:
ich geh jetzt davon mal aus das du es ähnlich hast, probier dennoch mal diesen code bei dir
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; 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 00:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz