Delphi > Mobilní vývoj

Pomale FireDAC/AnyDAC na iOS

(1/3) > >>

Andy:
Ahoj lidi
delam aplikaci v XE4 pro iOS je to dosti rozsahla aplikace z lokalni SQLite a "realtimovou" synchronizaci na MySQL na server.

Aktualni problem je v tom ze jsou hrozne a primo priserne odezvy od SQLite na uplne jednoduchy dotaz

--- Kód: ---SELECT * FROM mydata WHERE SHORTNAME LIKE "'+sname+'" AND ACTIVE = "true"
--- Konec kódu ---
ktery vybere nazev polozky a vlozi ho do tabulky (StringGrid).

Nic extra jsem nekonfiguroval proste jen jednoducha db a na form placle komponenty od FireDAC
kdyz jsem pouzival UniDAC tak to jelo jako blesk presel jsem na firedac a vyber polozky z db a vlozeni do tabulky trva vterinu a postupne se dostane az na dve
coz je neprijatelne.
Osobne jsem z SQLite nikdy noc nedelal, takze jaksi mozna tam staci zapnout neco a bude to. Proste jen mne prekvapuje ze UniDAC jsem tez nenastavoval a bylo to super.
jedine co menim oproti vychozimu nastaveni je

--- Kód: Delphi ---  oParams := TStringList.Create;  oParams.Add('Database=' + SYS_DATADIR + 'config');  oParams.Add('Pooled=True');  oParams.Add('JournalMode=Off');  ADManager.AddConnectionDef('SQLite_My', 'SQLite', oParams); a to je kvuli Poolingu ze pouzivam thready ale jen jeden konektor

Jo a moje otazka je zda nevite nekdo jak to mam nastavit aby mi zase vybery fungovaly rychle jako driv?
Za kazdou dobrou radu predem diky Andy

Petr Houf:
Dobrý den,
pokud byly podmínky při použití AnyDAC a FireDAC shodné (rychlost byla měřena na stejném fyzickém zařízení nebo v simulátoru, tatáž velikost DB a její nastavení) nebude problém v SQLite. Nicméně přesto doporučuji zkontrolovat, zda jsou sloupce v kterých se vyhledává indexovány (předpokládám že všude nepoužíváte klauzuli "Like", která se s indexy nemá moc ráda :-)). Dále bych doporučil nastavit tyto parametry:
SQLiteAdvanced=page_size=4096 (doporučovaná velikost DB stránky)
PRAGMA synchronous=OFF (operace nečekají na zápis na disk)

Co se týče FireDAC komponent:
Pro zvýšení výkonu se doporučuje, pokud je to možné, načíst celou DB do paměti (pomocí TADSQLiteBackup) a pomoct může i komunikace s DB na úrovni API (uADPhysSQLiteWrapper). Více informací naleznete na http://docs.embarcadero.com/products/rad_studio/firedac.

Andy:
Dekuji za odpoved,
stroj a DB jsou stejne co se tyce nastaveni pouzivam vychozi nastaveni.

Co se tyce TADSQLiteBackup tak nacist DB do pameti nevidim problem ale spis mne pak zajima otazka jak resit ulozeni dat do DB kdyz bude v pameti. chapu ze ji rychle prectu a co kdyz mi aplikace spadne tak pocitam ze prijdu o data  coz je zase nepripustne.

< z >:
co se tyce ukladani - vhodne je nezapisovat stale, ale treba to proste kazdou minutu ulozit, pokud je to potreba ;)

Andy:
Tak se priznam ze jsem z toho drobet na vetvi.
zkusil jsem zkopirovat DB do pameti a je to rozdil cca 20 msec.
pritom co je zajimave kdyz ten dotaz provedu 3x po sobe a merim cas tak kazdy dalsi trva o par msec delsi dobu
premyslel jsem jestli by to nemohlo byt tim ze ty udaje vkladam do tabulky a tabulku pritom prohledavam na shodnou polozku ale kdyz jsem to casovani rozkouskoval tak zjistil jsem ze to je opravdu vyberem z DB.
Pritom je tam jen cca 300 polozek takze i pri pouziti LIKE to nemuze te DB delat problemy.
Kdyz jsem pouzil UniDAC tak je to vyrazne rychlejsi ale jelikoz jsem 2 dny predelaval projekt do FireDAC tak uz se mi ho nechce predelavat nazpet.

Edit:
provedl jsem testovani na jednoduchem dotazu

--- Kód: MySQL ---SELECT * FROM products WHERE ID = 5a zpomaluje jak UniDac tak FireDAC akorat FireDAC o neco rychleji
tak si rikam jestli to neni spis neco v FM2 protoze v FM1 + UniDAC to litalo stejne rychle jako na PC ...

Navigace

[0] Seznam témat

[#] Další strana

Přejít na plnou verzi