Die beste Möglichkeit, aus einer großen CSV-Datei zu lesen, ohne alles mit Javascript in den Speicher zu laden

8

Ich benutze Atom / Electron für den Aufbau einer App, die Visualisierungen über Video basierend auf Daten hat. Jedes Video hat eine entsprechende CSV-Datei mit Informationen für jeden Frame. Die Videos sind ungefähr 100 Minuten lang, also haben die Dateien viele Daten!

Das Problem, das ich habe, ist, dass es ein paar Sekunden dauert, die Datei zu laden und zu analysieren. Meistens ist das kein Problem. Aber ich muss Playlists für Teile von Videos erstellen und das Laden der gesamten CSV-Datei jedes Mal, wenn ein Video geändert wird, ist keine praktikable Option.

Ich habe versucht, Streaming-Optionen als Fast-csv zu speichern, aber ich habe es nicht geschafft, für einen beliebigen Teil der Datei zu lesen.

EDIT: aus der FS-Dokumentation. In diesem Fall lautet die Frage: Wie kann ich wissen, welches Byte der gewünschten Position in der Datei entspricht?

  

-Optionen können Start- und Endwerte enthalten, um einen Bereich von Bytes zu lesen   aus der Datei anstelle der gesamten Datei. Sowohl Anfang als auch Ende sind   inklusive und bei 0 beginnen.

Was wäre Ihrer Meinung nach der bessere und performantere Ansatz für diese Situation?

Im Konkreten:

Gibt es eine Möglichkeit, einen Stream von einem beliebigen Teil einer CSV-Datei zu lesen?

Glauben Sie, dass es eine andere Speichermethode gibt, mit der ich dieses Problem besser lösen könnte?

UPDATE:

Am Ende habe ich das gelöst, indem ich die Daten in einer Datei im Binärformat gespeichert habe. Da ich weiß, wie viele Spalten die Datei hat, kann ich direkt aus dem Segment der Datei lesen, ohne irgendwelche Auswirkungen auf die Leistung.

    
limoragni 22.06.2015, 19:08
quelle

2 Antworten

1

Nach meinem Kommentar scheint Sqlite das zu sein, wonach du suchst. Es ist vielleicht nicht Ihre dauerhafte Lösung auf lange Sicht, aber es wird sicherlich vorläufig funktionieren, während Sie entschieden haben, ob Sie dabei bleiben oder Ihre eigene Lösung programmieren wollen.

Innere Funktionsweise von Sqlite

Sqlite ist auf den Kern optimiert, hat aber drei Hauptmerkmale, die dazu führen, dass es schneller als normale Plattenlesevorgänge ausgeführt wird, insbesondere CSV-Dateien:

  1. Die gesamte Datenbank (jede von Ihnen erstellte Datenbank) wird in einer einzigen Datei gespeichert, nicht in mehreren Dateien oder Datensätzen.
  2. Diese Datei wird in 1024-Byte-Blöcke (1K) ausgelagert, so dass Sie leicht um die Daten herumspringen können.
  3. (Wirklich Teil von 2) Das gesamte Datenbank- und Paging-System ist ein riesiger binärer Baum, der normalerweise weniger als 10 Sprünge benötigt, um irgendwelche Daten zu finden. Also in Laien ausgedrückt, extrem schnell!

Wenn Sie wirklich daran interessiert sind, den vollen Umfang von all dem zu verstehen, habe ich keine bessere Erklärung gefunden als diesen tollen Blogpost von Julia Evans .

Mögliche Nachteile

Sqlite ist neben den internen Funktionen als Client-Seite gedacht, die auf dem Benutzercomputer arbeitet. Wenn dies keine praktikable Lösung ist, gibt es Workarounds, die durchgeführt werden können. Sqlite kann zum Beispiel als Webserver verwendet werden, aber es gedeiht am besten in einer eigenständigen oder gemischten Installation. Denken Sie auch daran, dass jeder Clientcomputer anders ist. Ein Computer verarbeitet möglicherweise Datensätze schneller als die nächste, aber im Allgemeinen müssen Sie sich keine Sorgen machen, da clientseitige Computer normalerweise nur wenig belastet werden.

  • Standalone würde alles auf der Clientseite erfordern. Dies ist typischerweise, wie Sqlite verwendet wird. Ich habe es in der Vergangenheit für Spiele verwendet und dabei die API von sqlite4java verwendet, um mit Java eine Verbindung zur Datenbank herzustellen. Die API hat die ganze Erfahrung wie PHP und MySQL auf einem Server empfunden. Möglicherweise müssen Sie andere APIs finden, da Sqlite in C geschrieben ist.
  • Mixed Instillation wird genauso durchgeführt wie Standalone, aber Sie programmieren in Ihrem Programm einen Link zu einem tatsächlichen Server. Bei den Spielen half ich dabei, Dinge wie Spielstände und Benutzerdaten zu verfolgen und diese dann periodisch im Hintergrund an einen tatsächlichen Server weiterzugeben, wenn wir eine Verbindung herstellen konnten. Dies funktioniert auch umgekehrt. Sie können den Benutzer mit nichts anfangen, aber beim ersten Lauf kann er alles herunterladen, was Sie brauchen, und von diesem Moment an bleibt er auf dem neuesten Stand mit dem, was auf dem Server ist.

Zusammenfassung

Sqlite wird für das funktionieren, was Sie brauchen, aber vielleicht benötigen Sie ein paar Hausaufgaben, um es auf die von Ihnen benötigte Weise einzurichten. Sqlite4java zum Beispiel ist einfach zu installieren, aber verwirrend zu lernen, da ihre Dokumentation so schlecht ist; Stack Overflow hat mich aber durchgebracht. Sqlite ist auch eine Verwendung und vergessen Sie es Art der Installation, um Ihre Frage zu beantworten, wird es 25 Zeilen pro Sekunde wie Kuchen behandeln, müssen Sie sich keine Sorgen über die Optimierung nur Ihren eigenen Code.

    
Blizzardengle 24.07.2015, 16:24
quelle
2

Ich würde Papaparse dafür sehr empfehlen. Es ermöglicht das zeilenweise Streaming einer CSV-Datei, die im JSON-Format basierend auf den Headern in der Datei verarbeitet werden kann.

Innerhalb eines config-Objekts, das an die Parsing-Funktion übergeben wird, können Sie einen "step" -Parameter angeben, der eine Funktion ist, die für jede Zeile der Datei ausgeführt wird, während sie durchläuft.

Hinweis: Kann auch für die Verwendung eines Worker-Threads konfiguriert werden, um die Leistung bei der Verarbeitung sehr großer CSVs zu erhöhen

Ссылка

    
locksem 23.07.2015 17:00
quelle