1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

Datenbankabgleich zu langsam, Ideen benötigt

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von -MrPink-, 12.05.2011.

  1. -MrPink-, 12.05.2011 #1
    -MrPink-

    -MrPink- Threadstarter Junior Mitglied

    Beiträge:
    40
    Erhaltene Danke:
    11
    Registriert seit:
    26.02.2010
    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
     
  2. ApeDick, 13.05.2011 #2
    ApeDick

    ApeDick Android-Hilfe.de Mitglied

    Beiträge:
    114
    Erhaltene Danke:
    8
    Registriert seit:
    21.03.2011
    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.
     
  3. -MrPink-, 13.05.2011 #3
    -MrPink-

    -MrPink- Threadstarter Junior Mitglied

    Beiträge:
    40
    Erhaltene Danke:
    11
    Registriert seit:
    26.02.2010
    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
     
  4. RED-BARON, 13.05.2011 #4
    RED-BARON

    RED-BARON Android-Hilfe.de Mitglied

    Beiträge:
    146
    Erhaltene Danke:
    19
    Registriert seit:
    06.10.2009
    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
     
  5. Thyrion, 13.05.2011 #5
    Thyrion

    Thyrion Ehrenmitglied

    Beiträge:
    11,845
    Erhaltene Danke:
    2,450
    Registriert seit:
    21.07.2009
    Phone:
    Nexus 5X
    Ich vermute mal, die 5000 (synchronen?) Web-Requests bremsen das ganze aus.
     
  6. Kranki, 13.05.2011 #6
    Kranki

    Kranki Ehrenmitglied

    Beiträge:
    3,831
    Erhaltene Danke:
    814
    Registriert seit:
    19.07.2009
    Tablet:
    Samsung Galaxy Tab 3 7.0 Lite
    Das vermute ich auch. Tausende kleiner XML-Dateien einzeln laden klingt für mich auch unglaublich langsam.
     
  7. -MrPink-, 13.05.2011 #7
    -MrPink-

    -MrPink- Threadstarter Junior Mitglied

    Beiträge:
    40
    Erhaltene Danke:
    11
    Registriert seit:
    26.02.2010
    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: 13.05.2011
  8. Thyrion, 13.05.2011 #8
    Thyrion

    Thyrion Ehrenmitglied

    Beiträge:
    11,845
    Erhaltene Danke:
    2,450
    Registriert seit:
    21.07.2009
    Phone:
    Nexus 5X
    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
     

Diese Seite empfehlen