![]() |
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:
nun lese ich eine datei aus, filesize zeigt mir ca. 63000
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; 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 |
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. |
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...
|
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 |
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 ... |
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 |
Re: wie speicher sparen -> out of memory
Zitat:
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. |
Re: wie speicher sparen -> out of memory
keine ini datei, die ist extrem einfach aufgebaut,
beispielzeilen
|
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) ;-) |
Re: wie speicher sparen -> out of memory
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:40 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