Datenbankabgleich zu langsam, Ideen benötigt

M

-MrPink-

Neues Mitglied
11
Hallo,

im Zuge des Studiums beschäftige ich mich gerade
mit Android Programmierung bzw mit der Kommunikation
zwischen Android und einer Datenbank im Netz und hab
nun ein kleines Problem.

Kurz zum Allgemeinen, es geht um eine Anwendung die sich Messwerte
aus dem Netz holt diese verarbeitet und aufbereitet.

Lokal habe ich eine DB mit 12 Tabellen, welche Messwerte von einer Datenbank im Netz aufnehmen sollen.
Das ganze läuft soweit auch schon, die Messwerte stellt ein
Rest Webservice als XML mit xlink Navigation zur Verfügung,
welche wider rum von einem SaxParser in Android gelesen werden.

Nur musste ich nun leider feststellen das das ganze bei einer großen
Anzahl von Messwerten unglaublich langsam ist, nach ner halben Stunde hab
ich abgebrochen, selbst 100 Messwerte parsen braucht schon
spürbar Zeit. Ich weiss ich könnte noch wegen des geringeren Overheads auf JSON wechseln, aber ich glaube nicht das der Unterschied so dramatisch ausfallen würde.

Nun überleg ich beim erstmaligen Start der Anwendung einen partiellen Dump der großen DB herunterzuladen und zu importieren. Danach würde dann ein Service im Hintergrund die Aktualisierung übernehmen, das sollte dann auch zu parsen sein, da nicht so oft ( alle 15min) neue Messwerte kommen.

So jetzt aber zur eigentlichen Fragen :)
Die Pros unter euch können doch bei meinen Ideen sicher nur müde lächeln, was wäre denn der einfachste bzw beste Weg das möglichst schnell & effizient zu implementieren?

Danke schonmal für eure Antworten...

Mfg

MrPink
 
Bist du dir sicher, dass es am Parsen selbst liegt und nicht vielleicht am DB-Zugriff? Wie du ja bereits geschrieben hast, dauert es bei großen Datenmengen länger. Eventuell solltest du dir auch mal den Aufbau der DB anschauen, wie dort die Zugriffspfade sind. Ich kann mir gut Vorstellen, dass hier auch einiges an Performance liegen gelassen wird.
Was ich auch schon desöfteren gesehen haben, sind Programmierer, die anstatt einen Select auf die DB abzusetzen, für jede Satz einen einzelnen Select inclusive Aufbau der Connection machen.

Um wirklich zu schauen wo denn nun die Performance verloren geht, solltest du dir in deinen Code Zeitmessungen einbauen, die in die Logs geschrieben werden. So kannst du immer nachvollziehen, wie lange irgendwas gedauert hat.
 
Danke erstmal für die Antwort, und nee sicher bin ich mir nicht wo genau
Zeit verloren geht. :)

Datenbankzugriff erfolgt in beide Richtungen via Singleton, das mit
den Zeitmessungen hab ich mir aber auch schon überlegt und nur mal kurz ausprobiert, ein Datensatz parsen und einfügen lag jeweils bei 500ms :D
Ich hab allerdings jetzt noch einiges "optimiert" (zumindest hoffe ich das ;) ), z.b. alles auf Stringbuffer umgestellt und darauf geachtet beim iterieren nicht massenhaft Objekte zu erzeugen usw, werd damit nachher mal noch weitermachen und dann heute abend mal schauen wies jetzt läuft, und vor allem was wieviel Zeit braucht.
Aktuell konnte ich immerhin in 18min mal 5000 Datensätze parsen, aber das ist
natürlich immer noch viel zu lang :)

Ich glaub immer noch, dass mein Problem architekturbedingt ist, durch xlink ist es mir möglich auf jeden einzelnen Datensatz von Messdaten als XML File zuzugreifen, das hatte ich eigentlich als Vorteil gesehen, bedeutet aber auch das ich jeden einzelnen Eintrag parsen & inserten muss,
Also z.b. meinserver.de/sensor01/1 bis meinserver.de/sensor01/5000 sind dann jeweils generierte XML Files mit einzelnen Datensätzen.

mfg
 
Hmm,

nur weil die Zahl 5000 Datensätze auftaucht. Bei mir dauern die Inserts
in die sqlite-db ca. 2 Minuten. 1 Datensatz = 12 Spalten. Der Download
incl. "parsen" ca. 20 Sekunden. Übertragen werden die Daten komprimiert
und in einem binären Schema | Länge/Wert Format. Die Werte können also
sequenziell "angesprungen" werden.

Als Server wird eine MySQ-DB verwendet. Bisher hat sich noch niemand
beschwert, dass es zu langsam wäre.

Vll. bist Du was die Schnittstelle zur DB angeht doch etwas flexibler. XML,
JSON ist vll. ned das passende für Dich - oder Du beschränkst Dich eben
doch auf den Sync nach einer DB-Initalisierung. Evtl. kannst Du die Daten
auf dem Server schon in eine sqlite exportieren und läds die fertige Datei
auf das Gerät !?

Grüße und viel Erfolg, RB
 
Ich vermute mal, die 5000 (synchronen?) Web-Requests bremsen das ganze aus.
 
Das vermute ich auch. Tausende kleiner XML-Dateien einzeln laden klingt für mich auch unglaublich langsam.
 
Ja eben, das wars was ich ja vermutet hatte (sollte man eigtlich mit logischen Denken selbst drauf kommen), mittlerweile weis ich es auch sicher :)
Die Webrequests gehen pro Vorgang 200-300ms, den Datensatz (5 Spalten) dann in die DB schreiben ca 10ms.

@RED-BARON
Danke erstmal, bezogen sich deine Werte auch auf 5000 Datensätze ?
Hättest du zufällig ein Beispiel bzw noch ein paar Stichwörter für mich wie ich die Daten komprimiert im Binärformat übertrage, ich glaube ich stehe gerade etwas auf dem schlauch?

Ich denke es wäre kein Problem den Inhalt der MySQL Datenbank auf dem Server noch jeder Aktualisierung in sqlite zu exportieren und zum Download anzubieten, das war ja auch meine erste Idee nachdem ich gemerkt habe wie langsam das ganze ist. Sollte mithilfe von talend Arbeit von ein paar Minuten sein.

Ein anderer Ansatz wäre, wenn ich einfach auf dem Server ein PHP Skript ablege, das mir dann je nach Aufruf die ganze Tabelle, oder was eben gewünscht wäre als JSON File ausliefert. Damit hätte ich zumindest mal die große Anzahl an Requests umgangen, wie lang das ganze dann zum parsen braucht müsste ich halt mal noch schauen.

Was würdet ihr denn empfehlen ?
 
Zuletzt bearbeitet:
a) Wieso überträgst du in XML und nicht in z.B. JSON oder Plain CSV (und dabei einfach im WebServer HTTP-Compression aktivieren)? Es ist doch immer die gleiche Datenstruktur, oder? Und bei "Messwerten" wohl auch immer nur Zahlen, das sollte sich super komprimieren lassen - ok, dadurch hast du wieder etwas Verlust beim dekomprimieren, aber denk auch an "kleine" Bandbreiten im Mobilnetz.
b) Lass dir pro Sensor alle benötigten Werte geben und nicht einzeln
 

Ähnliche Themen

S
  • skywalker22
Antworten
1
Aufrufe
175
swa00
swa00
S
Antworten
17
Aufrufe
556
jogimuc
J
R
  • RalfKahl
Antworten
4
Aufrufe
185
RalfKahl
R
Zurück
Oben Unten