Tabelle mit sehr vielen Einträgen...

  • Hallo zusammen,

    ich hätte mal eine Frage zur effektiven Datenverarbeitung bei vielen Tabelleneinträgen... Die Tabelle auf meiner Webseite kann alle paar Millisekunden aktualisiert werden. Dabei wird jeder neue Datensatz in der ersten Zeile eingefügt und der rest dementsprechend nach unten geschoben. Wenn die Tabelle allerdings sehr viele Einträge hat, merkt man, dass der Browser mit der Datenverarbeitung nicht mehr hinterher kommt und es passiert so gut wie gar nichts mehr.

    Deshalb wollte ich mal hier fragen, wie ihr das so gelöst habt?!

    In diesem Projekt arbeite ich mit html, javascript, php und mit der Datenbank sqlite.

    Gruß Kellermann66

  • Hallo,

    wie definierst du "Tabelle" in deinem Kontext - ist das die DB-Tabelle oder eine Darstellung auf der Webseite?

    Erfolgt der Eintrag von neuen Werten via Browser oder direkt serverseitig und der Browser holt "nur" die Daten ab? Wie ist der Server, der die Daten aus der DB liest, an Netzwerk angebunden und was ist das für ein Rechner? Bei "alle paar Millisekunden" spielen ja ggf. auch schon Netzerklatenz und I/O Geschwindigkeit eine Rolle.

    Gruß, noisefloor

  • Servus Kellermann66,

    in einem solchen Fall würde ich im Browser nur einen "Ausschnitt" der Daten anzeigen und die nicht sichtbaren Werte erst beim scrollen nachladen.

    Wenn Du die von noisefloor angemerkten Informationen nachlieferst, kann man da vielleicht mehr sagen.

    cu,

    -ds-

  • Das erscheint mir alles wenig sinnvoll.

    Wenn die Tabelle alle paar ms aktualisiert wird, rauschen die neuen Einträge seitenweise über den Bildschirm - schneller als man sie lesen kann... Was bringt das?

    Bei 25 ms hast du 40 Einträge in der Sekunde. Macht in 24 Stunden 3,5 Mio Einträge.

    Und klar: Wenn du oben neue Einträge einfügst und unten alles beibehältst, ist die Datenmenge nach kurzer Zeit so groß, dass die Netzwerkübertragung und der Browser nicht mehr nach kommen. Dann werden Sekundenlang Daten übertragen und dein Bildschirm aktualisiert sich nur noch sporadisch in immer größeren Abständen - bis irgendwann gar nichts mehr geht.

    Vielleicht kannst du mal den Hintergrund dieser Anwendung erläutern. ich glaube, dass dein Ansatz grundsätzlich nicht zur Aufgabe passt.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Erstmal danke für eure Antworten!

    wie definierst du "Tabelle" in deinem Kontext - ist das die DB-Tabelle oder eine Darstellung auf der Webseite?

    Bei der "Tabelle" geht es um die Darstellung auf der Webseite.

    Erfolgt der Eintrag von neuen Werten via Browser oder direkt serverseitig und der Browser holt "nur" die Daten ab?

    Also die Daten werden momentan nicht in der DB gespeichert. Wenn ein neuer Datensatz verfügbar ist, wird dieser direkt im JSON-Format vom Raspberry Pi mithilfe eines WebSockets zum Browser geschickt und dort in Javascript verarbeitet und und in die Tabelle geladen.

    Vielleicht kannst du mal den Hintergrund dieser Anwendung erläutern. ich glaube, dass dein Ansatz grundsätzlich nicht zur Aufgabe passt.

    Der Raspberry Pi hat zwei CAN-Kontroller die alle CAN-Botschaften mitlesen sollen. Wenn dann ein neuer Frame eingelesen wurde, wird dieser verarbeitet, zum Browser geschickt und dort angezeigt.

    Wenn die Tabelle alle paar ms aktualisiert wird, rauschen die neuen Einträge seitenweise über den Bildschirm - schneller als man sie lesen kann... Was bringt das?

    Bei 25 ms hast du 40 Einträge in der Sekunde. Macht in 24 Stunden 3,5 Mio Einträge.

    Das macht in diesem Fall nichts. Es kann eine Aufzeichnung gestartet sowie gestoppt werden. Ist die Aufzeichnung gestoppt, wird die Tabelle nicht aktualisiert. Hierbei heißt es auch nicht, dass alle paar Millisekunden, 24 Stunden lang Daten empfangen werden. Es sind immer nur kleine Zeiträume. Allerdings, wenn man mal paar Minuten aufzeichnet, bekommt man recht viele Daten. Damit hat der Browser dann Probleme...

  • Warum willst du das mit einem Browser machen?

    Wäre es nicht einfacher mit einem Programm, das die erfassten Daten (5 Minuten = ein paar tausend Datensätze) im RAM speichert, so dass du sie schnell und einfach durchscrollen kannst?

    Während der Erfassung der Daten wird immer die nächste Zeile geschrieben und die alten scrollen nach oben weg - da hast du kaum Ressourcenverbrauch. Die Zeilen in einem Browser oben anzufügen ist wohl generell aufwändiger.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Wenn das klappen soll, musst du jedenfalls umgehen, dass der Browser bei jedem Eintrag die gesamte HTML-Seite neu aufbaut.

    Ich nehme an, da musst du dein Java-Script optimieren. Leider kenn ich mich da nicht aus.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Hallo,

    außerdem spielt hier auch die Ausführungsgeschwindigkeit (der JS Engine) und die Geschwindigkeit der Netzwerkschnittstelle ein Rolle. Bei beidem ist der Raspi ja keine "Raket"...

    Wie viele Daten hälst du den im Speicher? Wie wie groß ist ein Datensatz? Wenn das OS anfangen sollten zu swappen, dann wird's richtig langsame.

    Grundsätzlich stimme ich Gnom aber zu, dass der Browser hier ein suboptimales Darstellungsmedium ist....

    Gruß, noisefloor

  • Die Webseite wird nicht bei jedem neuen Eintrag neu aufgebaut... Die Daten werden mittels jquery in die Tabelle eingefügt.

    außerdem spielt hier auch die Ausführungsgeschwindigkeit (der JS Engine) und die Geschwindigkeit der Netzwerkschnittstelle ein Rolle. Bei beidem ist der Raspi ja keine "Raket"...

    Wie viele Daten hälst du den im Speicher? Wie wie groß ist ein Datensatz? Wenn das OS anfangen sollten zu swappen, dann wird's richtig langsame.

    An dem Raspi wird es nicht liegen. Wenn ich mir die Daten über Putty ausgeben lasse, funktioniert alles. Der Browser auf dem Desktop-PC / Laptop macht irgendwann schlapp... Ich glaube, dass dem irgendwann die Daten zu viel werden.

    Einmal editiert, zuletzt von Kellermann66 (29. Januar 2018 um 15:30)

  • Der Browser auf dem Desktop-PC / Laptop macht irgendwann schlapp... Ich glaube, dass dem irgendwann die Daten zu viel werden.

    Dann begrenze die Ausgabe.

    Sagen wir bis max. 200 Zeilen, wenn die 201ste kommt, wir die älteste aus der Tabelle gelöscht.

    Oder per Timestamp.

    Jedes <tr> bekommt eine Klasse ts_<timestamp> und es werden zyklisch Zeile, die älter als x Sekunden sind, gelöscht.

    Die Klasse auf volle Minute oder vielfaches davon runden!

  • Da ich dazu bisher nichts gelesen habe: Wie aktualisierst du die Zellen deiner Tabelle - oder allgemein: Wie aktualisierst du deine Tabelle?

    Beitrag#5 habe ich gelesen, auch das bzgl. Websockets. Trotzdessen die Frage. Bitte Code-schnippel zeigen.

  • Da ich dazu bisher nichts gelesen habe: Wie aktualisierst du die Zellen deiner Tabelle - oder allgemein: Wie aktualisierst du deine Tabelle?


    Beitrag#5 habe ich gelesen, auch das bzgl. Websockets. Trotzdessen die Frage. Bitte Code-schnippel zeigen.

    Das ist meine Funktion, die eine neue Tabellenzeile erzeugt. Allerdings können zwei Tabellen damit aktualisiert werden. Ich hoffe, dass es nicht ganz so schlecht geschrieben ist, denn das ist bisher mein zweites Projekt mit Javascript und musste es mir halt selber beibringen... Für Tipps bin ich deswegen immer sehr dankbar!

    Ich habe es auch mal getestet. Bei ca. 8000 Einträgen bekommt der Browser Probleme...

  • Sofern ich das richtig sehe aktualisiert du einfach _alles_ auch wenn sich an der jeweiligen Row nichts geändert hat? Das wäre dann etwas suboptimal ;)


    PS: Du könntest die \" durch ' ersetzen, das machts etwas übersichtlicher.

  • Sofern ich das richtig sehe aktualisiert du einfach _alles_ auch wenn sich an der jeweiligen Row nichts geändert hat? Das wäre dann etwas suboptimal

    Ne, eigentlich nicht. Die Funktion wird immer aufgerufen, wenn ich vom Raspberry Pi eine Nachricht mit dem neuen Frame bekommen habe. Aus diesen Daten wird die Row erstellt und dann entweder ans Ende oder an den Anfang der Tabelle eingefügt.

  • Du musst das ganze in zwei Schritte aufteilen.

    Einmal in einer "Datenbank", in welche du dir anzuzeigenden Daten schreibst. Und hier finde ich es sehr unpraktisch, wenn du die Daten in einem Format annimmst, das viel Overhead hat. (Wobei XML noch schlimmer wäre)

    Schreibe die empfangenden Daten in eine Datenbank, bei der du dir neuesten Daten unten anfügst.

    Aus dieser Datenbank werden dann die Daten im passenden Zeitpunkt gelesen.

    Und zwar nur die benötigten Daten, und, damit der jüngste Wert oben steht, wird das beim Auslesen gleich entsprechendes berücksichtigt.

    Wenn z.B. die Datenbank eine HTML-Formatierung vornehmen kann, dann lässt man das die DB machen. Wenn nicht, wird die Formatierung auf das minimale beschränkt, damit die Ausgabe möglichste schnell geht.

    Man lässt die speziellen 'Anwendungen' (DB-Engine und Co) so viel von der Arbeit automatisch erledigen, wie es möglich ist.

    Computer ..... grrrrrr

  • Aber eine ROW ist doch eine Zeile <tr>... Also schreibst du jedes mal eine ganze Tabellen-Zeile neu, auch wenn sich in den jeweiligen Zellen <td> nichts geändert hat.

    Das ist nur eine Vermutung von mir, kann auch sein das dein Problem damit 0,nix zu tun hat, aber es wirkt schon etwas zu viel... Wobei ich natürlich kein blassen Dunst davon habe was überhaupt das ganze soll :daumendreh2: Weder was dargestellt wird noch wieso alle paar Millisekunden aktualisiert werden muss.

    Als letztes würde ich noch unterschiedliche Browser probieren, welchen du nutzt geht bisher auch nirgends hervor.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!