Databases op mobiele apparaten.

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 00:09
Even direct de situatie die ik heb:
Op een Android tablet/telefoon voor versie 2.3 en nieuwer gebruik ik voor mijn applicatie een sqlite database. Deze database wordt periodiek bijgewerkt en daarbij worden de ontbrekende regels aangevuld en bestaande regels vergeleken op aanpassingen en zonodig vervangen. Helaas groeit de database nu al tot 150 MB, en ik verwacht dat hij nog niet is uitgegroeid. Selects op data gaat redelijk snel, maar inserts en updates van regels begint merkbaar traag te worden. Het gaat bijvoorbeeld om tabellen met ruim 700.000 regels.

Ik heb al wat optimalisaties doorgevoerd en dat scheelde een stuk in snelheid, maar nu heb ik geen significante optimalisaties meer gevonden. Ook tijdelijk droppen of aanmaken van extra indexen biedt weinig tijdwinst, terwijl ik het in elk geval zeker een factor 10 sneller wil hebben.
Als ik de ruwe data direct naar een tekst-file wegschrijf i.p.v. naar sqlite is hij ruim een factor 100 sneller, dus aan de snelheid van het flash-geheugen ligt het niet.

Ik vraag mij dus af of een sqlite database voor deze hoeveelheden data wel een geschikte keuze is, en of andere databases ook vergelijkbaar traag zijn. Ik zie wel andere type databases die zeggen dat ze beter zijn dan sqlite, maar vraag mij af of dat ook zo'n flinke snelheidswinst oplevert die ik wil hebben.
Wat hebben jullie voor alternatief gevonden om grote hoeveelheden data op te slaan en uit te lezen?

Speel ook Balls Connect en Repeat


Acties:
  • 0 Henk 'm!

  • deadinspace
  • Registratie: Juni 2001
  • Laatst online: 00:46

deadinspace

The what goes where now?

Wat is traag? Hoe lang duurt een UPDATE of INSERT? Hoe snel wil je het hebben? Hoe snel was het toen je tabellen nog niet zo groot waren?

Merk in ieder geval op dat sqlite standaard bij elke transaction naar disk synchroniseert, om dataveiligheid te garanderen. Dat levert relatief veel vertraging op. Als je een verhoogd risico op dataverlies/corruptie bij stroomuitval e.d. wil accepteren, dan kun je veel snelheidswinst boeken op writes door dat uit te zetten, zie de documentatie:
PRAGMA database.synchronous = 0 | OFF | 1 | NORMAL | 2 | FULL;

Query or change the setting of the "synchronous" flag. The first (query) form will return the synchronous setting as an integer. When synchronous is FULL (2), the SQLite database engine will use the xSync method of the VFS to ensure that all content is safely written to the disk surface prior to continuing. This ensures that an operating system crash or power failure will not corrupt the database. FULL synchronous is very safe, but it is also slower. When synchronous is NORMAL (1), the SQLite database engine will still sync at the most critical moments, but less often than in FULL mode. There is a very small (though non-zero) chance that a power failure at just the wrong time could corrupt the database in NORMAL mode. But in practice, you are more likely to suffer a catastrophic disk failure or some other unrecoverable hardware fault. With synchronous OFF (0), SQLite continues without syncing as soon as it has handed data off to the operating system. If the application running SQLite crashes, the data will be safe, but the database might become corrupted if the operating system crashes or the computer loses power before that data has been written to the disk surface. On the other hand, some operations are as much as 50 or more times faster with synchronous OFF.

...

Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 00:09
Dat is inderdaad interessant om eens de snelheid te testen met synchronous OFF. Ik kan vlak voor het synchroniseren een database backup maken, zodat een corrupte database tijdens het synchroniseren geen fataal probleem zal zijn, en de applicatie dan automatisch de oude database terug zet.

Ik heb overigens ook met verschillende transacties getest. Elke insert apart, of elke x-aantal regels in 1 transactie, maar daarmee kreeg ik geen factor 10 snelheidswinst. Om dit moment heb ik nu 1000 regels per transactie staan.

Verder zie ik nu op https://www.sqlite.org/speed.html snelheden staan die ik zeker niet haal. Hij is een stuk sneller dan test 1, maar vele malen langzamer dan test 2. Overigens heb ik alleen indexen op strings staan, niet op integers waardoor de snelheid misschien ook flink kan inzakken.

Ik denk dat ik met synchronous zeker wat snelheidswinst kan boeken. Ik ga het testen. :)

Speel ook Balls Connect en Repeat


Acties:
  • 0 Henk 'm!

  • Lethalis
  • Registratie: April 2002
  • Niet online
Moet de database per se op het apparaat staan dan?

Anders zou je een web api kunnen bouwen waarmee de app praat.

Ask yourself if you are happy and then you cease to be.