Avatar billede bbe1379 Nybegynder
17. august 2003 - 16:04 Der er 14 kommentarer og
2 løsninger

Bedste performance til ordbog

Jeg skal lave en ordbogsagtig funktion, som erstatter bestemte ord i en tekst med et link til en side.

Det er jo ikke så kompliceret at lave en replace(str,ord,link) men jeg er lidt bekymret over ydeevnen.
Ordene der skal ledes efter ligger nemlig i en database (ca. 60-70 forskellige ord - måske flere) og teksten der skal ledes i ligger i en anden tabel i basen.

er der nogen der kender en bedre måde at gøre det på end at lave en replace-funktion for hvert eneste ord der skal ledes efter?
Avatar billede netro Nybegynder
17. august 2003 - 18:26 #1
Du kunne jo kigge lidt på RegExp.
Avatar billede nmh Nybegynder
17. august 2003 - 18:31 #2
Er teksten meget stor?
jeg vil da gætte på, at det er databaseopslagene, der tager mest tid.
Lav nogle forsøg først, for at se om replace er for langsom.
Avatar billede bbe1379 Nybegynder
17. august 2003 - 19:10 #3
netro > ...har jeg gjort - og bruger det også. Men har ikke rigtigt fundet frem til andet end:

regEx.Pattern = "((^|[^a-z])" & wordRS("word") & "([^a-z]|$))"
wordlookup = regEx.Replace(wordlookup,"LINK")

...og det er jo stadig en hel masse replace. Jeg kan ikke helt gennemskue at lave regExp'ene så komplicerede. Ville det være muligt, at lave ét som indeholdt alle ord?...og kan du vise mig hvordan?

nmh > Teksternes omfang varierer. Ligger typisk på 6000-8000 karakterer.
Replace funktionerne dræber den ikke, men jeg tænker også lidt på, hvad der sker når 10 mennesker henter sider samtidig. Min egen 2,5GHz puter laver et hop til 50% CPU nå jeg henter en side.
Avatar billede bbe1379 Nybegynder
17. august 2003 - 19:11 #4
netro > linket der skal erstattes med er ikke det samme hver gang. Det afhænger af ordet den finder.
Avatar billede nmh Nybegynder
17. august 2003 - 19:23 #5
Hvis du henter et ord, derefter kører replace, henter et nyt ord etc.
så tror jeg nok belastningen på serveren vil blive udjævnet.
men det må komme an på en prøve.
Inden man bruger en masse tid på de regulære udtryk, så se først om det simple ikke er godt nok.
Avatar billede netro Nybegynder
18. august 2003 - 21:56 #6
Tjaa... hvis du har din tekst her, der er hentet fra din anden tabel:

Streng = "Jeg skal lave en ordbogsagtig funktion, som erstatter bestemte ord i en tekst med et link til en side."

- og du har en tabel med følgende struktur (hvilket jeg antager):

ID      Ord    Link
====================
1    funktion  banan
2      side    gravko

- så er det næsten det nemmeste bare at lave en simpel replace:

***************************************************************

Start = Timer()

Set rs = Conn.Execute("Select Ord, Link From Tabel")
While Not rs.EOF
  Streng = Replace(Streng, rs("Ord"), rs("Link"), 1, 1, 1)
  rs.MoveNext
Wend

Slut = Timer()

Response.Write "Det tog i alt " & Slut - Start & " sekunder at erstatte ordene."

***************************************************************

Det var så det, du selv var inde på. Men prøv så at aflæse, hvor lang tid det egentlig tager. Det burde være meget minimalt.
NB: Det sidste tal i Replace-funktionen angiver, at vi ønsker at lave en tekstsammenligning (der ikke er case-sensitive). Binær sammenligning markeres med et 0.
Avatar billede bbe1379 Nybegynder
19. august 2003 - 00:32 #7
Jeg har testet det - og som jeg skrev væltede det ikke computeren helt. Jeg var bare ude efter en smartere måde at gøre det på.

Lige nu bruger jeg noget lignende dit ekspempel, bare med et regExp der checker at det er hele ordet fra strengen der matcher opslaget.
Avatar billede netro Nybegynder
21. august 2003 - 23:03 #8
Jeg ved ikke, om det bliver meget smartere end det. Hvad forlanger du da mere?
Avatar billede bbe1379 Nybegynder
22. august 2003 - 22:22 #9
Jeg er ikke just ekspert i at lave smart regExp's men det kunne måske være en mulighed at lave et regExp med alle ordene? Det ville jeg f.eks. gerne vide om var muligt.
Avatar billede nmh Nybegynder
22. august 2003 - 22:33 #10
Hvormeget tid spares ved at benytte RegExp i forhold til det helt simple med replace?
Min filosofi er: Brug altid det helt simple, hvis der ikke vindes noget væsentligt ved mere indviklede metoder.
Avatar billede bbe1379 Nybegynder
23. august 2003 - 17:30 #11
Jeg er ikke ude på at spare tid på programmeringen.
Funktionen skal bruges til et system med temmeligt mange brugere, og hvis jeg kan spare 25% serverbelasstning pr. side der hentes, så kan det mærkes for hver enkelte bruger.

...og min folisofi er, altid at finde den mest optimale løsning på et problem - også selvom det tager lidt tid ;-)
Avatar billede nmh Nybegynder
23. august 2003 - 19:30 #12
Med tid mente jeg faktisk ikke programmerings tiden men den tid der bruges af serveren. Og hvis der her kun er en marginal forbedring, så er det den simple løsning der "vinder".
Men har du målt en forbedring på 25%?
Avatar billede bbe1379 Nybegynder
23. august 2003 - 20:23 #13
Når jeg kører scriptet med replace-funktionen går CPU belastningen 25-35% op, i forhold til kørsel uden replace. Det synes jeg er temmeligt meget, hvis der hentes bare 10-15 sider samtidigt. Systemet vil have ca. 1000 brugere, så det er i virkeligheden sikkert urealistisk lavt.
Avatar billede netro Nybegynder
25. august 2003 - 22:03 #14
Tror ikke du skal hænge dig så meget i den CPU-procent. Afprøv det i praksis, når der er mange brugere. Hvis det begynder at gå irriterende langsomt, kan du overveje, hvad du så vil gøre. Men det burde overhovedet ikke være noget problem. Kan godt være, at der er 1000 sessions på én gang, men hvor mange tror du opdaterer samme side på samme millisekund? Mit bud er højest 2-3.

Nu ved jeg ikke, hvilken database du anvender, men jeg går ud fra, det ikke er Access med alle de brugere. Jeg ved, MySQL har en Replace-funktion, du kan bruge i selve dit SQL-statement, så ASP slipper for at gøre det.
---------> Replace(Column, Find, Replace)

Var det svar nok?
Avatar billede bbe1379 Nybegynder
28. august 2003 - 19:42 #15
Se nu begynder det at ligne noget (med MySQL'en) :)
Jeg bruger godt nok MS SQL 2000, men hvis du kender til lignende funktioner er jeg meget nysgerrig.

..mht. om det var svar nok: som titlen på spørgsmålet antyder, er jeg ikke ude efter en løsning der fungerer - men den løsning der fungerer bedst.
Systemet jeg laver vil udvikle sig med tiden, og der vil 100% komme nye funktioner, som også kræver CPU kraft. Jeg forsøger blot at være på forkant, så jeg ikke sidder om 1 år med 10 semi-gode løsninger, som sløver hele sytemet - hvis du forstår :)
Avatar billede bbe1379 Nybegynder
05. september 2003 - 13:07 #16
netro > ikke helt nok, men her er lidt for indsatsen alligevel
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