04. september 2002 - 20:19Der er
21 kommentarer og 1 løsning
læs og find selv en titel :/ kan ikke finde på en selv
hey jeg har jo spørgsmål ..
jeg er igang med at læse en txt fil ind: var Fil: integer; Buffer: PChar; FilLength: integer; BytesRead: Integer; i: integer; begin Fil := FileOpen('logfil.txt', fmOpenRead); FilLength := FileSeek(Fil,0,2); FileSeek(Fil,0,0); Buffer := PChar(AllocMem(FilLength + 1)); BytesRead := FileRead(Fil, Buffer, FilLength); FileClose(Fil); for i := 0 to BytesRead-1 do begin memo1.Lines.Add(Buffer[i]); end; end;
Dette er den kode jeg lige kunne finde på til at læse txten ind med.
Al den txt jeg har læst ind havde jeg tænkt mig at gemme i et record, men er det nu også den mest hensigtsmessige ting at gører, jeg skal nemlig lave et output til sidst hvor jeg har lagt alle de ting sammen som måske optræder flere gang med forskellig verdi og til sidst skal alt sorteres efter højeste værdi.
hvad vile værer den hurtigtste måde at gører det på? ` ville et array fx værer bedre/hurtigere/nemmere end det record jeg havde tænkt mig ?
hmm tjoo.. det var ikke en dum ide.. bortset fra at jeg nok ikke var precis nok.. når jeg har læst min fil ind så skal jeg parse den altså.. finde ud af hvor mange bananer jeg har og hvor mange æbler hver for sig.. sådan mere som en database.. hvor jeg har en tabel med en 3 felter navn, antal bananer og antal pærer derefter skal læ likke alle forekomster af navn samme så det bliver til en forekomst med alle antal bananer og alle antal pærer. og så til sidst sorterer listen efter hvem der har flest antal bananer..
altså ikke noget specifikt.. men som sagt har jeg selv koden der regner ud hvor mange bananer og hvor manger pærer der er i hver linie
skal bare bruge noget at likke det ind i så det er nemt at likke alle referenver af stoney's bananer og pærer samme til en stor sum af pærer og bananer
og derefter sorterer efter hvem der har flest og så lave en lille txt fil med det
hmm nu er jeg endelig kommet igenne.. hehe der var jo film i tv så det gik jo kun med et ½ øje :D.. men borris kommer jo med 2 eksempler.. kan ikke lige afgører hvilke af dem der er hurtigt.. men kikker på dme imorgen,, måske er en af dem merer velegnet end den anden
måske for borris også kikket herind i morgen og selv kommentrer det :D
dar.. så gik ie ned.. havde ellers lige skrevet en halv roman :D :. nu er jeg kommet frem til at denne koder er hurtigst:
procedure TForm1.Button4Click(Sender: TObject); var f: File; logfile: pchar; logfilesize: integer; begin tid := GetTickCount; AssignFile(f, 'fil.txt'); Reset(f, 1); logfilesize := FileSize(f); logfile := StrAlloc(logfilesize+1); blockread(f, logfile^, logfilesize); Closefile(f); strdispose(logfile); end;
kunne det laves bedre ? og lige nu likker al min txt jo i en lang plører.. så den vil værer temmelig besværlig at parse og det ville da værer noget af et loop :D.. + jeg skal jo også til sidst når jeg er nået helt ned til efter parsing: navn x y z --------------- loke 1 5 9 atlanta 10 55 66 stoney 75 2 4 stoney 5 10 2 atlanta 5 20 5
så skal det jo smækkes sammen til:
navn x y z --------------- loke 1 5 9 atlanta 15 75 71 stoney 80 12 6
og der skal så bagefter sorteres efter højeste tal x:
navn x y z --------------- stoney 80 12 6 atlanta 15 75 71 loke 1 5 9
loke-liscom det der er prob med dit foreslag er at det ikke er hurtigt nok.. se her..
Loke-Liscoms ide: 90,000 ms Loke-Liscoms ide: 90,000 ms Loke-Liscoms ide: 90,000 ms Loke-Liscoms ide: 90,000 ms Loke-Liscoms ide: 90,000 ms Loke-Liscoms ide: 80,000 ms Min Ide: 50,000 ms Min Ide: 60,000 ms Min Ide: 60,000 ms Min Ide: 60,000 ms Min Ide: 60,000 ms
loke du er genial.. den du lige har givet er storset lige så hurtig.. men den du kom med som løsning til den anden .. hvis man sætter den for højt op går det bare langsommere og det hurtigste jeg kunne få den til var 80ms .. og de andre tar ca 60ms .. :D
Loke-Liscoms ide #2: 60,000 ms Min Ide: 50,000 ms Loke-Liscoms ide #2: 60,000 ms Min Ide: 60,000 ms Loke-Liscoms ide #2: 60,000 ms Min Ide: 60,000 ms Loke-Liscoms ide #2: 60,000 ms
og nu er det ikke PChar.. for lad os sige det ligeud.. mig og PChar = dårlig blanding :D
Det er klart at din ide er den hurtigste, det kan ikke gøres hurtigere! Der er 2 måder at loade filer på, der er Windows API- og Delphis rutiner de er bare lige hurtige :) se http://www.eksperten.dk/spm/253332
Min 2. ide er det samme som din ide jeg putter bare dataen ind i en string. Da block størrelsen er den samme som filstørrelsen bliver hele filen loadet ind i stringen på éen gang. Det eneste problem er at du kan ikke lave en progressbar der viser hvor langt det er kommet med filen. PChar og string er nærmest det samme men når du bruger string holder Delphi styr på pointer ol. og det gør det meget lettere.
blockread(f, logfile[1], logfilesize); //logfile[1] er en pointer til begyndelsen af strengen. eller til den første PChar.
Grunden til at første eks. er langsommere er at man heletiden loader lidt data og så kaster man det lidt rundt imellem nogle variabler og så gør man det hele igen.
Har du fået nok nu eller skal du også have nogle hurtige rutiner til at sortere dataen?
hvis du kan lave en genial ide til at sortere min data som er parset fra stringen ned i et array.. så ville det værer perf.. kan sq ikke selv lige helt komme på en ide til at knække den. :/ min data likker som sagt i arrayet på den her måde:
navn x y z --------------- loke 1 5 9 atlanta 15 75 71 stoney 80 12 6
og skal sorteres efter x
men med hensyn til at delphi holder styr på pointers og sådan.. gør det det ikke også en smule langsommere ?
Delphi er vist reletiv god til at håndtere sine dynamiske typer, der er vist ikke den store foreskæl rent hastigheds messigt.
skal du udelukkende bruge dine data i hukommelsen eller skal de gæmmes efter de er sorteret i en ny struktureret fil?
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.