Avatar billede martin_andersen Nybegynder
18. juni 2002 - 17:29 Der er 39 kommentarer og
1 løsning

"SetTextBuf" hjælper ikke meget - er der en bedre løsning

Jeg skal lave en applikation, som kan gennemlæse store
tekstfiler(o 300MB) så hurtigt som muligt. Jeg skal kontrollere hvad der står på alle linier af filen.

Hvordan gør man det bedste(hurtigst)?

Jeg læste at man selv kan definere en buffer ved
hjælp af "SetTextBuf", og herefter skulle læsningen
bliver hurtigere. Dette er afprøvet og det gav ikke
meget.

Jeg har også forsøgt at læse større bider af filen med
"BlockRead" og derefter gennemgå disse bider. Dette viste sig at være endnu værre.

Er der nogen der har en ide om hvordan dette gøres
bedst(hurtigst)?
Avatar billede hermandsen Juniormester
18. juni 2002 - 17:40 #1
Har du prøvet Readln/Pos?
Avatar billede hermandsen Juniormester
18. juni 2002 - 17:44 #2
function FindMig(HvadSkalJegFinde, FilNavn: String): Boolean;
var
  F: File;
  S: String;
begin
  FileMode := 0;
  AssignFile(F, FilNavn);
  Reset(F, 1);
  Result := False;
  while not Eof(F) do
  begin
    ReadLn(F, S);
    Result := Pos(HvadSkalJegFinde, S) <> 0;
    if Result then Break;
  end;
  CloseFile(F);
end;
Avatar billede martin_andersen Nybegynder
18. juni 2002 - 17:47 #3
Jeg benytter Readln nu.. Her er et kode eksempel:
//-----------------------

AssignFile(F, fileName);
SetTextBuf(F, Buf);
reset(F);

Count := 0;
While not Eof(F) do
begin
  Readln(F, Temp);
  if Temp = ':END:' then
      Inc(Count);
  o.s.v.....
end;

CloseFile(F);
//----------------------------------------------
Avatar billede hermandsen Juniormester
18. juni 2002 - 17:49 #4
Og det er ikke hurtigt nok? Hmmm, så står jeg på bar bund! :(
Avatar billede martin_andersen Nybegynder
18. juni 2002 - 17:54 #5
Jeg ved ikke om man kan sige det er hurtigt, spørgsmålet er
om man evt. kunne gøre det hurtigere på en anden måde?

Og har "SetTextBuf" overhovet nogen effekt på
læsehastigheden af filen?

Ellers tak for hjælpen:-)
Avatar billede hermandsen Juniormester
18. juni 2002 - 18:12 #6
Jeg ved det faktisk ikke... Har aldrig brugt/haft brug for det... :)
Avatar billede pellelil Nybegynder
18. juni 2002 - 20:00 #7
Du finder nok ikke noget langsommere end TekstFiler, men jeg kan vamt anbefale BlockRead som du (af "ukendte årsager") ikke er glad for. Når du bruger BlockRead så er der 2 ting der er vigtigt
- Brug en relativ stor buffer (4, 8, 16, 32 eller 64 KByte)
- Når du kalder Reset så kan man vælge at overføre en RecSize, sæt ALTID denne til 1 (F.eks. "Reset(F, 1);"). Hvis du ikke gør så er RecSize 128 og hvis du skriver "BlockRead(F, Buffer, 4096, Res)" så læser du rent faktisk godt 500.000 Kb i stedet for kun 4 KB (noget der kan få BlockRead til at "virke langsom").

En helt anden ting er selve søgningen. I dette sammenhæng efterlader Delphi's egen POS meget at ønske. En Boyer-Moore algoritme kan således nemt "hægte" Delphis egen pos og gøre en søgning indtil flere gange hurtigere. Borrisholt har "noget kode" til dette formål så muligvis han melder sig på banen med dette !?
Avatar billede borrisholt Novice
19. juni 2002 - 08:24 #8
skal du søge i din text fil eller hvad ?

Jens B
Avatar billede martin_andersen Nybegynder
19. juni 2002 - 10:41 #9
Tekstfilen består af ekstremt mange relativt korte linier(Tags).
Eks.
  :010:
  :202: evt. tekst
  o.s.v...

Jeg skal finde antallet af bestemte tags i meget store
tekstfiler(300MB eller mere). Jeg skal evt. også gemme positionen
på disse tags i tekstfilen, således at jeg kan kopiere en del af tekstfilen over i en anden efter gennemlæsningen.

På nuværende tidspunkt tager det ca. 2 minuter bare at læse en 300MB fil
igennem uden at behandle linierne(Altså med ReadLN). Som jeg før har omtalt, så har jeg også prøvet at benytte "BlockRead", som korrekt
gør læsningen hurtigere med den rigtige bufferstørrelse. Dette gør dog
at jeg nu har en buffer, hvor jeg først skal finde ud af hvor linien
stopper og derefter skal undersøge om denne linie indeholder det jeg
leder efter. Dette gør det mere tungt end ReadLN.

Så det jeg leder efter er måske en hurtig metode til at søge i en Charbuffer?
Avatar billede borrisholt Novice
19. juni 2002 - 10:44 #10
Stik mig lige din mail adr. Så skal jeg lige sende dig en lille søge dims.

Jens B
Avatar billede martin_andersen Nybegynder
19. juni 2002 - 10:53 #11
Det ville være skide godt:-)

hvis det ikke fylder for meget så:

"Martin-Andersen@e-main.dk"
Avatar billede borrisholt Novice
19. juni 2002 - 10:57 #12
sendt !

Jens B
Avatar billede borrisholt Novice
19. juni 2002 - 10:58 #13
Pelle >> Jeg har lige sendt manden vores søge algoritme sjov.... Tror du ikke en turbosearch kan løse problemet for ham ?

Jens B
Avatar billede pellelil Nybegynder
19. juni 2002 - 11:01 #14
Hvis du med TurboSearch mener BoyerMoore-Hest-et-eller-andet søge-routinen så er der ikke nogen tvivl om at den kan klare opgaven
Avatar billede martin_andersen Nybegynder
19. juni 2002 - 11:15 #15
Der er noget galt med ovenstående mailadresse.
Kan du ikke sende den til "man@des.dk"
Avatar billede borrisholt Novice
19. juni 2002 - 11:42 #16
hov martin .. Jeg havde slet ikke set at min mail klient ikke havde sendt min mail ... Den siger domænet ikke eksisterer ....

Jeg har lagt den ud til download her :

http://borrisholt.com/Eksperten/inst.zip

Jens B
Avatar billede martin_andersen Nybegynder
19. juni 2002 - 11:44 #17
fino

tak for hjælpen:-)
Avatar billede borrisholt Novice
19. juni 2002 - 11:47 #18
Den vil kunne tælle forkomster i din text fil, med en hastighed du bliver bange for ...

Jens B
Avatar billede borrisholt Novice
19. juni 2002 - 12:14 #19
du blev så stille
Avatar billede martin_andersen Nybegynder
19. juni 2002 - 12:30 #20
jeg skulle lige ud og spise lidt frokost... prøver det nu.

Hvordan fungere dette point-system, jeg har accepteret svaret og
klikket på dit navn. Har du fået dine fortjente point?
Avatar billede borrisholt Novice
19. juni 2002 - 12:36 #21
Nej dem fik Pelle (pellelil) ... :-)

Jens B
Avatar billede borrisholt Novice
19. juni 2002 - 12:37 #22
Det er min egen skyld ... Jeg havde ikke posted et svar ...

Jens B
Avatar billede pellelil Nybegynder
19. juni 2002 - 12:40 #23
God arbejds-fordeling, du klare opgaven jeg "score fortjensten". Nu vi er igang vil du ha' mit Kontonummer således jeg også kan få udbetalt din løn ?  ;-)
Avatar billede martin_andersen Nybegynder
19. juni 2002 - 13:12 #24
Yep.. den er 5 gange så hurtig

Har "File_Search" problemer med store tekstfiler?
Avatar billede martin_andersen Nybegynder
19. juni 2002 - 13:15 #25
aaahhh

    ffilesize := system.FileSize( f );
    GetMem( fbuffer, ffilesize );

Der skal vist lige fixes lidt for at den kan håndtere store filer:-)
Avatar billede borrisholt Novice
19. juni 2002 - 14:41 #26
Den virker da fint .... Ellers må du splitte din fil op i mindere stykker ...

Jens B
Avatar billede borrisholt Novice
19. juni 2002 - 14:41 #27
Ellers må du købe noget mere ram ..-

Jens B
Avatar billede martin_andersen Nybegynder
19. juni 2002 - 14:48 #28
Ja... jeg kunne jo købe noget mere ram...

Nej... jeg prøver at splitte filen op:-)
Avatar billede borrisholt Novice
19. juni 2002 - 15:39 #29
How oges ... virker det ?

Jens B
Avatar billede martin_andersen Nybegynder
19. juni 2002 - 15:56 #30
Den virker fint... meget kvik!

Løsningen for mig er nok at udvide "file_Search" lidt, således at
den kan håndtere en given buffer ad gangen. Evt. ved at
lave en "LoadBuffer()" og en "UnLoadBuffer()". På denne måde kan
selv kontrollere hvor meget den skal flæske igennem ad gangen.

Alternativet er at "File_Search" selv skulle kunne splitte filen
op og håndtere det hele selv, men det er nok lidt mere problematisk.
Avatar billede borrisholt Novice
19. juni 2002 - 15:58 #31
Begge løninger skulle du helst have i luften på under 10 min !

Jens B
Avatar billede borrisholt Novice
19. juni 2002 - 15:59 #32
Det med at splitte filen er det nemmeste ...

Jens B
Avatar billede borrisholt Novice
19. juni 2002 - 16:02 #33
Det klart nemmeste er blot at loade hele filen også lade Windows håndtere resten ...

Du ved Page file ...
Jens B
Avatar billede martin_andersen Nybegynder
19. juni 2002 - 16:17 #34
Problemet er at du ikke altid kan oprette en buffer på samme
størrelse som filen selv.
Avatar billede borrisholt Novice
19. juni 2002 - 16:20 #35
Nå jeg vil hejm ....

Jens  B
Avatar billede pellelil Nybegynder
19. juni 2002 - 21:19 #36
Hvis du splitte filen op i "flere bidder", så skal du være ekstra opmærksom på de stedet hvor du deler filen. Med andre ord hvis du leder efter "Hest" kan du risikere at "He" står i den ene buffer og "st" i den anden. Du er således nødt til at "gøre lidt gymnastik" for at fange disse situiationer.
Avatar billede borrisholt Novice
20. juni 2002 - 08:42 #37
Det er bare at dele efter en linje ...

Jens B
Avatar billede pellelil Nybegynder
20. juni 2002 - 08:46 #38
borrisholt> Ingen tvivl om at den er nem at fange, jeg ville bare påpeje at man lige skal være opmærksom på "problemer" (det vil jo vare katestrofalt at dele hesten)  :-)
Avatar billede borrisholt Novice
20. juni 2002 - 08:48 #39
Bestemt :-)
Avatar billede martin_andersen Nybegynder
20. juni 2002 - 14:11 #40
Man kan vel også bare hoppe "Length(Pattern)-1" tilbage før man
læser næste chunk. Således kan man være sikker på at man ikke registrerer et "hit" i hver buffer eller overser det.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester