Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 6 odgovora
  • 2.851 pregleda

Najnovija ↓

Procedura Lat2Cir - optimizacija? 28.10.2011. u 09:18 · pre 182 meseca
izmenjeno 1 put, poslednji put vortex77 28.10.2011. u 09:43
  1. vortex7728.10.2011. u 09:43zapis iz teksta poruke
#1
Pozdrav svima,

Aplikacija koju razvijam treba da formira izvestaj sa ćiriličnim podacima. U bazi se nalaze podaci koje korisnici mogu uneti i latinično.
Trenutno je "prevodilac" ugradjen u samu aplikaciju i radi konverziju na već pročitanim podacima iz baze. Prosečna obrada je oko 5 min (na tabeli od 40000 slogova sa 30 polja).

Pokušao sam da ceo problem rešim na nivou baznih procedura, ali brzina obrade je i dalje vrlo mala.

Evo i funkcije:

Code:

CREATE DEFINER = `root`@`%` FUNCTION `lat2cyr`(STRING_IN VARCHAR(500))
 RETURNS varchar(500) CHARSET utf8
    DETERMINISTIC
BEGIN
   declare brojac INT DEFAULT 0;
   declare pozicija INT DEFAULT 0;
   declare STRING_OUT VARCHAR(4000);  
   declare latSingle VARCHAR(54) DEFAULT   'ABCČĆDĐEFGHIJKLMNOPRSŠTUVZŽabcčćdđefghijklmnoprsštuvzž';
   declare latDouble VARCHAR(18) DEFAULT    'DžDŽLjLJNjNJdžljnj';
   declare cirSingle VARCHAR(54) DEFAULT   'ABCČĆDĐEFGHIJKLMNOPRSŠTUVZŽabcčćdđefghijklmnoprsštuvzž';
   declare cirDouble VARCHAR(18) DEFAULT    'Dž@Dž@Lj@Lj@Nj@Nj@dž@lj@nj@';

  SELECT STRING_IN INTO STRING_OUT;
  IF ((STRING_OUT = '-') OR (ISNULL(STRING_OUT))) THEN SET STRING_OUT = '';
  ELSE
     WHILE brojac < LENGTH(STRING_OUT) DO 
         SET pozicija = LOCATE(MID(STRING_OUT,brojac+1,2), latDouble COLLATE utf8_bin);      
         IF pozicija <> 0 THEN 
                SET STRING_OUT = REPLACE(STRING_OUT,MID(STRING_OUT,brojac+1,2),MID(cirDouble,pozicija,2) COLLATE utf8_bin);
                SET brojac = brojac + 2;        
         ELSE           
              SET pozicija = LOCATE(MID(STRING_OUT,brojac+1,1), latSingle COLLATE utf8_bin);
              IF pozicija <> 0 THEN 
                   SET STRING_OUT =  REPLACE(STRING_OUT,MID(STRING_OUT,brojac+1,1),MID(cirSingle,pozicija,1) COLLATE utf8_bin);           
                   SET brojac = brojac + 1;
              ELSE  
                    SET brojac = brojac + 1;
              END IF;                   
          END IF; 
     END WHILE;     
     SET STRING_OUT = REPLACE(STRING_OUT,'@','');
   END IF;
   RETURN STRING_OUT;
END;


Da li je moguće optimizovati ovaj kod?


Tnx
Re: Procedura Lat2Cir - optimizacija? 28.10.2011. u 11:13 · pre 182 meseca #2
Napravi dve tabele, Table_lat i Table_cir.
Drugacije neces dobiti poboljsanje, bez obzira da li radio na nivou MySQL-a ili PHP-a.
Mozes da napravis tigger da kada upisujes ili editujes u lat tabelu da ti napise odmah i u cir tabelu. Isto kada brises u lat da izbrise to i u cir tabeli.

Da te pitam kakav je to izvestaj sa 40.000 redova? Mozda koristis 40k slogova za dobijanje rezultata ali cisto sumnjam da prikazujes 40.000 slogova.
Ako je tacno ovo sto predpostavljam onda ti treba ovako nesto:

upit_cir -> convert_to_upit_lat -> izvrsi_upit_lat (nad 40.000 slogova) -> rezultat_lat (recimo 30 slogova) -> convert_to_rezultat_cir (samo 30 slogova)
Potpis
[Ovu poruku je menjao VladaSu dana 14.06.2003. u 11:22 GMT+1]
Re: Procedura Lat2Cir - optimizacija? 28.10.2011. u 11:30 · pre 182 meseca #3
@VladaSU
Hvala na odgovoru.
Ne, u pitanju je formiranje strukturnog TXT fajla prema specifikaciji korisnika. Podaci se vuku iz tabela i stvarno je potrebno prebaciti svih 40k slogova u txt fajl. Na zalost, nisam u mogucnosti da formiram dodatne tabele, vec sam ogranicen na funkcije i procedure (neke "pravne" peripetije oko admin. baze... znam da je bezveze).

Ono sto me interesuje jeste da li je funkcije nad stringovima koje sam koristio moguce zameniti i da li je moguce deklarisati drukciji tip za "drzanje" slova.
Re: Procedura Lat2Cir - optimizacija? 28.10.2011. u 17:33 · pre 182 meseca #5
Pa onda koristi 2 tabele. Jednu sa latinicom i jednu sa cirilicom i napravio automatiku koja ce da odrzava te dve tabele.
To ce da ti bude najbrze.
Potpis
[Ovu poruku je menjao VladaSu dana 14.06.2003. u 11:22 GMT+1]
Re: Procedura Lat2Cir - optimizacija? 29.10.2011. u 19:58 · pre 182 meseca #6
rece covek da "nisam u mogucnosti da formiram dodatne tabele, vec sam ogranicen na funkcije i procedure" ..

UDF koji radi transliteraciju na cirilicu bi ovde bio super resenje kada bolje razmislim :D no ne verujem da ako ti ne daju da dodas tabele da ce da ti dozvole da dodas udf
Potpis
arhimed
http://www.mysql.rs/ | http://elco.crsndoo.com/
Re: Procedura Lat2Cir - optimizacija? 29.10.2011. u 20:21 · pre 182 meseca #7
Onda mozda moze da doda kolone parent_lang pa ako je parent_lang 0 onda je na latinici ako ima neki broj onda je na cirilici i zna od kojeg je prevod kako bi kod menjanja i brisanja mogao da odradi update parenta. Ovo isto moze triggerima
Potpis
[Ovu poruku je menjao VladaSu dana 14.06.2003. u 11:22 GMT+1]
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme