Datenmenge, SQLite: wieviel ist akzeptabel ?

A

andy572

Ambitioniertes Mitglied
7
Hallo liebe Gemeinde ^^

ich arbeite gerade an einer neuen App für ein TV-Programm. Ja, es gibt schon einige ... aber irgendwie gefallen mir die bisher verfügbaren nicht wirklich, da entweder Regional-Programme oder Sky fehlen oder der ganze Kram unkomfortabel in der Bedienung sind oder die Daten selbst eher dürftig sind da nur "Jetzt", "Gleich", "20:00" und "22:00" angezeigt werden.

Nun meine Fragen dazu:
Ich generiere auf meinem Web-Server 1x am Tag ein XML über einen Cron für das aktuelle Tagesprogramm mit allen Sendern die ich bekommen kann.
Das entstandene XML File ist 967kB groß - was denkt Ihr: Ist das zu groß um es sich ein mal am Tag vom Server auf's Handy zu ziehen oder ist das noch im akzeptablen Rahmen ? Man könnte das XML auch so bauen, daß es nur die in der App ausgewählten Sender ausgibt, hat aber den Nachteil dass bei jeder Änderung in der App (Änderung der Senderauswahl) neue Daten aufs Handy gezogen werden müssten, ein dynamisches XML-File erstellt werden müsste was den Server belasten würde und natürlich auch die App langsam machen würde.

Erzählt doch mal, was Ihr für effektiv halten würdet - viellt. gibt es auch einen Mittelweg um gute Performance aus der App zu holen, bin für gute Ideen offen ;)

LG
Euer Andy
 
Was hältst Du von der Idee das XML-File zu komprimieren für die Übertragung? Als Blob in der Datenbank gespeichert ist es so auch gleich viel handlicher. Gerade XML kannst du meist auf ein Zehntel der ursprünglichen Größe eindampfen.

Hier mal ein einfacher Ansatz mit Deflater. Kommt natürlich auf den Server an, ob diese Methode in Frage kommt.

Code:
    private static byte[] compress(String xmlString)
    {
        ByteArrayOutputStream compressed = new ByteArrayOutputStream();
        DeflaterOutputStream dos = new DeflaterOutputStream(compressed);
        try
        {
            dos.write(xmlString.getBytes());
            dos.finish();
            dos.flush();
            dos.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        return compressed.toByteArray();
    }
    
    private static String inflate(byte[] compressed)
    {
        InflaterInputStream  in = new InflaterInputStream(new ByteArrayInputStream(compressed));
        ByteArrayOutputStream temp = new ByteArrayOutputStream();
        int b;
        
        try
        {
            temp.reset();
            while ((b = in.read()) != -1) {
                temp.write(b);
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        String result = new String(temp.toByteArray());
        return result;
    }
 
andy572 schrieb:
Ich generiere auf meinem Web-Server 1x am Tag ein XML über einen Cron für das aktuelle Tagesprogramm mit allen Sendern die ich bekommen kann.
Woher kommen die TV-Daten? XMLTV? Hast Du Dich schon über die rechtlichen Aspekte erkundigt?

Ansonsten auf jeden Fall komprimieren. Vielleicht kannst du erstmal schlanke Infos (ohne Beschreibungen) in einem Rutsch durchschicken, und dann Details auf Anfrage in einem weiteren Request anfragen.
 
Danke schon mal ;)

@Riffer:
Mein Server sollte gz Komprimierung können, ist ja Standard heutzutage. Wenn nicht kann man das ja auf dem Server auch direkt als datei.gz speichern und dann übertragen.

@Markus:
Die Daten sind noch etwas "illegal", werde das aber noch klären - hoffe daß das Unternehmen mir da keinen Strich durch die Rechnung macht und mitspielt, sonst habe ich keine 151 Sender mit insg. 4500 Datensätzen pro Tag :D
Zur Technik: Ich bin Webentwickler und kenne mich mit PHP/MySQL und Regex gut aus - eine Seite zu grabben ist also schon mal kein Problem, das ganze ordentlich als xml zusammen gebaut und dann speichern auch nicht :D

Wenn ich XMLTV nutzen will, brauche ich etliche Dinge auf dem Android, u.a. sogar Python damit das aktuelle Script (tv_grabber_de_tvtoday) läuft. Abgesehen davon sind diese Daten auch eher spärlich, da die nur aus freien RSS Feeds stammen - das habe ich derzeit in einem anderen Testprojekt so verbaut, bringt aber nix da der RSS nur "jetzt", "20:00" und "22:00" ausgibt :(
 
So, mal sehen was die Herrschaften antworten :)

Sehr geehrte Damen und Herren,

gerne nutze ich als Internet-Benutzer Ihre Webseite zu Informationen über das aktuelle Fernsehprogramm.

Ich bin auf die Idee gekommen, eine Anwendung für Smartphones, hier speziell für Android-Basierte Handys, zu erstellen wo sich ein User das das aktuelle Tages-Programm auf seinem Handy anschauen kann.
Um an die nötigen Daten zu kommen nutze ich vorerst Ihren RSS-Feed,
welcher jedoch leider zu wenig Daten enthält.

Nun zu meiner Frage: Gibt es eine ->legale<- Möglichkeit, um an ein aktuelles Tagesprogramm zu kommen ? Wenn ja, welche geschäftlichen Bedingungen muss ich als Programmierer dabei beachten und was könnte so ein Service Ihrerseits kosten ?
Die Möglichkeit, Ihre Inhalte auf den Seiten zu "grabben" halte ich für wenig Sinnvoll da dies ganz sicher gegen Ihre AGB's verstößt.

Mit freundlichen Grüßen
XXXXXX
 
Joah, können wir uns ja dann drüber unterhalten ;)

Habe eben das 970kB große XML mal mit zlib komprimiert - ich denke, das ist akzeptabel: das File ist nur noch 78kB groß. Hätte nicht gedacht, daß das so einen enormen Unterschied macht - damit wäre das Übertragungsproblem aufs Phone schon mal vom Tisch :)
 
Boah, ich bekomm's nicht hin:

Das XML auf dem Server wird mit PHP in GZIP (w9) komprimiert, und JAVA wirft einen Fehler: "Data error" :(

Gibt es da einen Trick bei ? Hab es mit InflaterInputStream,GZIPInputStream und ZipInputStream versucht - es geht einfach nicht *grrr*

Hilllffffäääääää :D
 
Nach etlichem hin und her spielen klappt die Übertragung nun endlich:

Das XML File wird auf Server-Seite mit PHP's gzwrite(dateihandler, "w9") gespeichert, wobei die XML-Daten als Base64 vorliegen müssen - das Resultat: 90kB Dateigröße, das spart schon mal 900kB an Übertragung. Die Base64 Kodierung deshalb, weil das dumme GZIP auf Java-Seite sonst mit dem UTF8 nicht klar kommt sobald eine Zeichenkette im XML quer schlägt...

Auf dem Handy muss die Datei erstmal mit einem FileOutputStream gespeichert werden, da merkwürdigerweise jeder Puffer den ich nutzen wollte ausgestiegen ist. Somit muss die Konvertierung nun folgend sein:
Erst GZIPInputstream, dann Base64InputStream und alles immer schön in eine Datei schreiben - wobei man bei dem Schreibprozess die Bytes mit der write-function des OutputStreams folgend nutzt: write(bytes, 0, groesse).

Das Resultat: eine schnelle Übertragung, der RAM des kleinen HTC-Magic quillt nicht über und die Daten werden sauber übertragen :)

Dann geht's jetzt auf zum SQLite - die geholten Daten müssen ja irgendwie in eine kleine Datenbank, denn jedes mal das XML auslesen stresst das Phone ja dann genauso ^^
 
andy572 schrieb:
Dann geht's jetzt auf zum SQLite - die geholten Daten müssen ja irgendwie in eine kleine Datenbank, denn jedes mal das XML auslesen stresst das Phone ja dann genauso ^^

AFAIK, SQLite verwendet DBase-Format was nicht wesentlich besser wie XML-Auslesen ist ;)


Bei meinen Highscore-System setze ich auf JSON, parse es in die Objekte und halte in einfacher Liste. Funktioniert mit 1000 Einträgen gut. Allerdings ist es angeraten die Daten in der Hintergrund zu laden.
 
Danke für den Hinweis mit der Möglichkeit JSON zu nutzen:
Ich kenne JSON vom Javascript her schon, macht aber denke ich in meinem Projekt keinen Sinn oder ?

obwohl ... beides muss erstmal geparsed werden - ob sich das ernsthaft was nimmt ?

Die Daten werden bis einschliesslich Base64.decode schon in einem extra Thread ausgeführt - sonst hab ich keinen Fortschrittsbalken und der User denkt "Da passier ja gar nix" ... so kann man wenigstens visuell sehen, was gerade gemacht wird;)
 
JSON ist wesentlich kompakter wie XML, und einen Parser hat Android eigebaut.

Ich ahbe auch eine kleine Datenbindung-Framework geschrieben:

ko5tik's jsonserializer at master - GitHub

(macht aus JSON Java-Objekte )

JSON wäre auch deswegen interessant, weil viele NoSQL-Datenbanken
es als Ergebnis-Format verwendet.

Du kannst zum Beispiel auf dem Server CouchDB Installieren, und eindfache Abfragen
dagegen machen - so haben die Leute immer aktuelle Daten nur dann wenn die es brauchen.
 
Musste den ganzen Kram nun doch aufsplitten - schön, dass die Übertragung in Bruchteilen von Sekunden passiert, aber das parsen von ca 1MB XML-Daten auf meinem HTC Magic ist 'ne Zumutung - nach paar Tests immer dasselbe Result: nachdem die Daten entpackt waren und das XML in ein Plain Text-File geschrieben war, sind satte 3 Minuten sinnlosen Wartens vergangen :(

Lösung dazu
Das Handy gleicht sich nun mit dem Server ab:
Einmalig Senderliste holen, dann Sender in der GUI selektieren (als "Favoriten")
und dann nur noch POST-Requests senden (beim aktualisieren) mit ausgewählten Sendern. Das schrumpft auf dem Handy das entpackte XML auf ca 200KB - das ist in Ordnung ;)

Nicht jeder hat alle SKY-Sender,Info-Sender und sämtliche Regional-Sender - was das XML unnötig aufbläht *denk*
 

Ähnliche Themen

R
Antworten
6
Aufrufe
993
swa00
swa00
U
  • unerfahrenerAppEntwickler
Antworten
3
Aufrufe
695
swa00
swa00
Zurück
Oben Unten