AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

392Byte * 610 Datensätze = 6MB???

Ein Thema von Blizzard · begonnen am 18. Jul 2003 · letzter Beitrag vom 18. Jul 2003
Antwort Antwort
Blizzard

Registriert seit: 4. Jan 2003
88 Beiträge
 
Delphi 6 Enterprise
 
#1

392Byte * 610 Datensätze = 6MB???

  Alt 18. Jul 2003, 14:33
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
  Mit Zitat antworten Zitat
Snoop007

Registriert seit: 15. Jan 2003
331 Beiträge
 
Delphi 6 Personal
 
#2

Re: 392Byte * 610 Datensätze = 6MB

  Alt 18. Jul 2003, 14:37
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
  Mit Zitat antworten Zitat
Blizzard

Registriert seit: 4. Jan 2003
88 Beiträge
 
Delphi 6 Enterprise
 
#3

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

  Alt 18. Jul 2003, 15:01
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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#4

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

  Alt 18. Jul 2003, 15:14
Moin Blizzard,

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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Snoop007

Registriert seit: 15. Jan 2003
331 Beiträge
 
Delphi 6 Personal
 
#5

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

  Alt 18. Jul 2003, 15:21
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
  Mit Zitat antworten Zitat
Blizzard

Registriert seit: 4. Jan 2003
88 Beiträge
 
Delphi 6 Enterprise
 
#6

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

  Alt 18. Jul 2003, 15:28
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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#7

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

  Alt 18. Jul 2003, 15:32
Moin Blizzard,

hast Du es statt der ShortStrings mal mit HugeStrings versucht?
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Snoop007

Registriert seit: 15. Jan 2003
331 Beiträge
 
Delphi 6 Personal
 
#8

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

  Alt 18. Jul 2003, 15:34
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
  Mit Zitat antworten Zitat
Blizzard

Registriert seit: 4. Jan 2003
88 Beiträge
 
Delphi 6 Enterprise
 
#9

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

  Alt 18. Jul 2003, 15:40
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
  Mit Zitat antworten Zitat
Snoop007

Registriert seit: 15. Jan 2003
331 Beiträge
 
Delphi 6 Personal
 
#10

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

  Alt 18. Jul 2003, 15:45
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 )
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:56 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