Parsen einer großen Matroska Datei

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: Parsen einer großen Matroska Datei

Beitrag von hubblec4 »

Danke für die ausführliche Erklärung. Denke das habe ich soweit verstanden.

Da habe ich dann aber eine neue Überlegung:
Wenn ich durch die 8000 Cluster parse, muss bei TBufStream erst, immer etwas eingelesen werden in den Speicher(klar 1mb sind da mehr als aussreichend, denke das könnte man auf ein paar Bytes reduzieren).

Nachdem die Daten in den Speicher geladen wurden sind, werden sie von dort aus nochmals ausgelesen-> fürs parsen.

TFileStream springt doch nur an die gewünschte Postion in der Datei und liest dann die "paar" Bytes(meistens 8 ) aus. Das sollte doch schneller gehen, weil einmal "Einlesen in den Speicher" wegfällt., oder?

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Parsen einer großen Matroska Datei

Beitrag von wp_xyz »

Ich habe keine Ahnung vom Matroska-Dateiformat. Wie groß ist denn so ein Cluster? 30GB/8000 = 4 MB? Wenn du diese jeweils komplett in einem Stück vom FileStream aus in einen Speicherblock einliest und dort den Parser laufen lässt, sehe ich keinen Vorteil des BufStream mehr. Sind die Cluster unabhängig voneinander? Wenn ja, könntest du noch Geschwindigkeit gewinnen, indem du für das Parsen eines Clusters einen eigenen Thread startest. Je nach Ausbau deiner Maschine hast du da mehrere zur Verfügung.

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: Parsen einer großen Matroska Datei

Beitrag von hubblec4 »

wp_xyz hat geschrieben:Ich habe keine Ahnung vom Matroska-Dateiformat.

Ich vermute mal aber das dir die VideoDatei Endung .mkv etwas sagt??
Aktuelle Matroska Specs https://matroska.org/technical/specs/index.html


wp_xyz hat geschrieben:Wie groß ist denn so ein Cluster? 30GB/8000 = 4 MB?

So ganz genau kann ich das nicht sagen, das ist eben alles abhängig davon was für Video, Audio, Sub Daten enthalten sind. Also wenige Bytes bis vielleicht 20 mb.

wp_xyz hat geschrieben:Wenn du diese jeweils komplett in einem Stück vom FileStream aus in einen Speicherblock einliest und dort den Parser laufen lässt, sehe ich keinen Vorteil des BufStream mehr.

Yupp, sehe ich auch so.

wp_xyz hat geschrieben:Sind die Cluster unabhängig voneinander? Wenn ja, könntest du noch Geschwindigkeit gewinnen, indem du für das Parsen eines Clusters einen eigenen Thread startest. Je nach Ausbau deiner Maschine hast du da mehrere zur Verfügung.

Die Cluster sind gereiht, dennoch könnte man dessen gesamten Byte Inhalt in einer Klasse "lagern" welche im eigenen Thread den Cluster parst.
Das ist vielleicht mal in ferner Zukunft der Fall, aber vorerst parse ich lediglich 3 Zeitstempel und ein paar andere Kleinigkeiten(EBML-ID, Cluster-Size, FirstSubElementPos).

Das geht alles fix, da anfangs nur Basis Daten "an-geparst" werden und dann später bei gewissen Clustern etwas intensiver geschaut wird. Ein Cluster besteht aus Unterelementen mit weiteren Elementen usw...

EDIT: Die Daten innerhalb des Clusters scheinen nicht das Problem zu sein, ich vermute mal es geht nur um die Anzahl der Cluster, wodurch das ERSTE parsen so lange dauert (Cache Problem wegen Windows). Bei kleineren Dateien mit 1000 oder 500 Clustern gehts super schnell.

Ich muss meinen Parser dann noch auf Linux testen, bin gespannt wie es sich dort verhält.

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: Parsen einer großen Matroska Datei

Beitrag von hubblec4 »

Ich muss doch nochmal etwas nachfragen.

Ich wollte herausfinden ob das "lange erste" parsen abhängig von der Cluster Anzahl ist. Dazu habe ich in einer Matroska Datei mal 10000 Kapitel eingefügt.
Das Parsen dauert etwas mehr als 50ms aber eben keine 30 Sekunden.

Kapitel sind im Prinzip genauso aufgebaut wie die Cluster. Allerdings sage ich jetzt mal mit meinem Leihenhaften Wissen, das dort die Daten/Bytes enger beieinander liegen.

In den Clustern gibt es Bild und Audio Daten, wo durch die Cluster "weiter verstreut" auf der Festplatte liegen.

Kann es damit zusammenhängen? (Oder völlig falsch gedacht)

Antworten