Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   wie speicher sparen -> out of memory (https://www.delphipraxis.net/27439-wie-speicher-sparen-out-memory.html)

Grumble 10. Aug 2004 10:10


wie speicher sparen -> out of memory
 
hi,

ich habe folgendes problem ...

ich soll eine textdatei auslesen und dort bestimmte werte in ein record schreiben, das sieht aber schon recht gross aus und wird auch noch in in dyn. array verpackt..

Code:
H=record
         Typ:string[2];
         RNr,PrArt,UArt,aHKl,mHKl,mTC,sTC,BildTC,Pvon,Pnach:shortint;
         UDAT,HBez,VSch,BSch:string[10];
         UOrt,STRN:string[30];
         UFirma:string[36];
         PrH,PrBr,PrNr:smallint;
         MAT:string[4];
         InSchutz,Zkrzl:string[7];
         UDir:string[1];
         ULang,Stat,MaxRB,ZkrzlZ1,ZkrzlZ2:real;
         VHSNr:string[3];
         hTC:integer;
         SMBez:string[5];
         BildDatBez:String[12];
        end;

      KKS=record
         Typ,DForm:string[2];
         RNr,LGD,HGD,Status,GForm,AAnschl,StEG,HGSchS:shortint;
         SchBez,altSchBez,Bem:string[10];
         Rwert,Hwert,DHSch,LD,BrD,LSch,BrSch,LSchUT,BrSchUT,HSchUT,SchS:real;
         BemLage:string[20];
         AbdKl,SchForm,SchHls,SchUTForm,EH,SchUpl,Abdpl:string[1];
         BJ:smallint;
         BSSchHls,BSSchOT,BSSchUT,BSG:string[4];
         InSchutz:String[7];
      end;

      KKH=record
         Typ,KnlArt:string[2];
         RNr,HGvSch,HGbSch,PrArt,Status,AbwArt,WSZ,BodArt,GrdWabst,NeigKl:shortint;
         HBez,altHBez,vSch,bSch:string[10];
         SHvSch,SHbSCH,HL,HFlges,HFlbef,HFlD,kSchmWZfl,kFrWZfl,kRWZfl,kGewZfl,kHZfl,kIZfl,kTrWZfl:real;
         PrH,PrBr,BJ:smallint;
         MAT:string[4];
         STRN:string[30];
         TEGNr:String[5];
      end;

      KKT=record
         Typ:string[2];
         RNr:shortint;
         EWD,WVbr,Stdm,FrWAn:real;
         TEGNr:String[5];
      end;

      HR=record
        Nr:integer;
        Typ:string[2];
        Vnr:string[4];
        Lbez,Lnr,ZB,EDat,Nu,Lknr,bDS:string[10];
        AZ,Bear,TAM:string[15];
        BANrmLK:string[5];
        txt:string[13];
        Htyp:array of H;
        KKStyp:array of KKS;
        KKHtyp:array of KKH;
        KKTtyp:array of KKT;
        end;

  IData=array of HR;
nun lese ich eine datei aus, filesize zeigt mir ca. 63000
nachdem ca. 5000 eingelesen worden sind krieg ich ne out of memory ... obwohl laut eines speichermenagers sogar noch 130 mb frei sind...
nun habe ich mir ueberlegt ob man evtl. die dateien splitten muss ...

habt ihr evtl. tips wie man wo speicher sparen kann? ich kann leider nicht vom record weg, ich wollte es erst sofort in ne datenbank schreiben, aber meine chefs wollen bloederweise n record

LeoDD 10. Aug 2004 10:39

Re: wie speicher sparen -> out of memory
 
Meines Wissens is der Datenspeicher nicht mit dem Hauptspeicher direkt vergleichbar. Deswegen is noch was frei und trotzdem voll ;)

Ich würds so machen:
Testweise mal "packed record" schreiben statt "record". Weiss aber nicht ab das soviel hilft.

Nicht alles komplett lesen sondern irgendeine Zwischenspeicherung vornehmen. Z.B. max. 1000 Einträge, dann in eine temporäre Datei sichern.

Solange es nur um Einlesen/Schreiben geht, is das simpel. Wenn aber noch Operationen wie Datensatz löschen u.ä. durchgeführt werden sollen, wird das kompliziert.

Grumble 10. Aug 2004 10:51

Re: wie speicher sparen -> out of memory
 
danke, aber packed record hat nich viel gebracht, ca. 250 zeilen mehr , zwischenspeichern entspricht irgendwie auch nich so der sache der aufgabe...

roderich 10. Aug 2004 11:13

Re: wie speicher sparen -> out of memory
 
wieso machst du nicht eine Klasse, die dann auch sauber in einer Methode ihren Speicher freigibt ?

Und mal was anderes, habt ihr mit Absicht die Variablennamen so gewählt, daß kein Mensch verstehen kann, was sie enthalten ? Oder stammt der Code noch aus einer Zeit, in der Variablen net mehr als 8 Zeichen haben konnten ?! Sieht ja echt übel aus..... :angel2:

Was hast Du eigentlich vor mit den Records, sollen die in eine Datei/DB gespeichert werden (wieso dann nicht sofort ?) oder willst du sie für irgendwelche Operationen im Speicher halten ? Dann wär eine Klasse wirklich angebracht.


Roderich

Grumble 10. Aug 2004 11:17

Re: wie speicher sparen -> out of memory
 
oh ? ne klasse bauen ? ich ahnungsloser gibbet da n tut fuer?

aehm die variablennamen hab ich aus purer faulheit so gewaehlt :) sind nur abkuerzungen ..

die records sollen spaeter wirklich in ne db, ich hab auch gesagt warum nich gleich, aber ich renn da gegen ne wand ... das ganze hat nur den zweck bestimmte daten aus ner textdatei zu importieren, die spaeter dem user praesentiert werden sollen, und er entscheidet was wo gespeichert wird ...

Dannyboy 10. Aug 2004 11:24

Re: wie speicher sparen -> out of memory
 
Hallo Grumble,
wie LeoDD bereits erwähnte wirst Du das Nachladen der Daten von
der Festplatte nicht verhindern können. Ich schreibe z.Zt. einen Leveleditor
und habe beim Anzeigen der Levels ab einer bestimmten Länge das gleiche
Problem. Daher werden von einem Level immer bloß 2000 Felder
(=8000 Bytes) auf ein Mal aus der Datei in den RAM geladen. Lieber etwas
aufwendiger programmieren und dafür effizient den RAM schonen.
Check this out.
DANNYBOY

Sharky 10. Aug 2004 11:25

Re: wie speicher sparen -> out of memory
 
Zitat:

Zitat von Grumble
...ich soll eine textdatei auslesen und dort bestimmte werte in ein record schreiben,...

Hai Grumble,
wie ist die Textdatei denn aufgebaut? Stehen alle Informationen für die Records in einer Zeile? Oder ist es eher wie bei einer INI das die Informationen in einzelnen Abschnitten stehen.
Eventuell hast Du ja mal einen kurzen Ausschnit der Datei.

Grumble 10. Aug 2004 11:28

Re: wie speicher sparen -> out of memory
 
keine ini datei, die ist extrem einfach aufgebaut,
beispielzeilen

  • H 0196 SE-DD 21.01.2004
    H
    HI 103.04.1931 ingutis/Limpert
    HI 201S77 Dr.-Külz-Ring
    HI 301S77 01S77 01S78 1015001000B 1 O 3 4
    HK 401S77 0.00 HA 0000
    HI 401S77 a.50 PA 0000
    HI 401S77 0.50 C--- A1 11.00 0000
    HI 401S77 4.10 01S77_1.JPG SN-L 0000

Sharky 10. Aug 2004 11:34

Re: wie speicher sparen -> out of memory
 
Es gibt also immer einen Hauptrekord und zu jedem Hauptrecord gibt es beliebig viele "unter Rekords".
Uff... das alles im Speicher zu machen ist doch echt Wahnsinn. Mache deinem Chef klar das dies absolut "Suboptimal" ist.
(Denn auch das ist die Aufgabe eines Programmierers) ;-)

Dannyboy 10. Aug 2004 11:36

Re: wie speicher sparen -> out of memory
 
Zitat:

Zitat von Grumble
keine ini datei, die ist extrem einfach aufgebaut,

Uuäääääää??? :gruebel: :gruebel: :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:17 Uhr.
Seite 1 von 2  1 2      

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