Schnellere Methode gesucht
-
Hiho
lese im Moment mit Hilfe von FileStream Daten Byteweise aus einem File. Leider kann ich die Bytes nicht der Reihe nach verwenden, sondern muss mit dem Seek-Befehl hinundher springen.
Hier mal ein Beispiel:FileStream fs = File.OpenRead("text.buf"); ... temp = fs.Seek(640, SeekOrigin.Current); temp1 = fs.ReadByte(); temp = fs.Seek(-6, SeekOrigin.Current); temp2 = fs.ReadByte(); ...
Dies geht zwar wunderbar, aber es ist ziehmlich langsam, weil das File 614400 Byte hat. Nochdazu muss ich eine geschachtelte for-Schleife für den Durchlauf der Datei verwenden.
Weiss jemand eine schnellere Methode bestimmte Bytes aus einem File zu lesen?Danke
-
Benutz mal nen BufferedReader, der cacht den Inhalt der Datei.
-
Um BufferedStream zu verwenden geh ich doch folgendermaßen vor:
FileStream fs = File.OpenRead("text.buf"); BufferedStream bs = new BufferedStream(fs); ... temp = bs.Seek(640, SeekOrigin.Current); temp1 = bs.ReadByte(); temp = bs.Seek(-6, SeekOrigin.Current); temp2 = bs.ReadByte(); ...
Bei mir ist das so um ca 10 Sekunden langsamer als ohne BufferedStream.
Kann man eigentlich eine doppelte for-Schleife umgehen oder verschnellern?
-
Ich weiss ja nicht mal, nach welchem System du die Bytes auslesen willst.
Lad halt mal alles in einem String oder Array vor und such darin.
-
Warum nicht erstmal alles laden?
Bye, TGGC (Der Held ist zurück)
-
nach welchen System, hmm da muss ich ein bischen mehr erklären. In der Datei aus der ich auslese sind Bilddaten einer Industriekamera gespeichert. Diese Daten liegen in Form einer Bayer-Matrix vor.
Bayer-Matrix:
r g r g r g
g b g b g b
r g r g r g
g b g b g bDiese Bayer-Matrix muss ich nun auflösen. Dazu benötige ich auf Grund der Struktur immer mindestens vier verschiedene Pixel. Ein rotes, ein blaues und zwei grüne. Diese vier Werte ergeben ein Farbpixel wie es zum Beispiel in bmp zu finden ist. (Natürlich kann man diese Auflösung beliebig kompliziert machen) um nun die verschiednen Farbpixel berechnun zu können muss ich in dem Stream hinundher springen können. Was auch ohne Probleme geht allerdings ist es leider zu langsam. und da keiner gerne 20 Sekunden wartet bis er ein Bild angezeigt bekommt versuch ich das ganze schneller zu machen.
-
Hey, das sind doppelt soviel g wie b und r. Ausserdem könnte man das ganz einfach linear einlesen und immer gleich an die richtige Stelle schreiben. Schreiben einfach die R,G und B immer gleich in den Pixel.
Bye, TGGC (Der Held ist zurück)
-
Das mit doppelt so vielen Grün-Pixel hat schon seinen Grund und um ein sauberes großes Bild darstellen zu können muss ich die Pixel miteinander verrechnen.
Außerdem wenn ich die Werte immer gleich an die entsprechnede Stelle schreiben, also wenn ich auf einem r stehe, welchen Wert hat dann grünen und blauen? In nächster nähe liegen immer vier grüne und vier blaue Pixel. Komm also ums verrechnen nicht rundum, außerdem verwende ich einen wesentlich komplizierteren Algorithmus als den oben beschriebenen.
-
Quotenmausi schrieb:
also wenn ich auf einem r stehe, welchen Wert hat dann grünen und blauen?
Das ist völlig irrelevant, denn das kannst du später immer noch speichern.
Bye, TGGC (Der Held ist zurück)
-
hmm das mit dem sequentiellen klingt interessant. falls das aber nicht gehen sollte, evtl. - ok, ist nicht genau das benötigte aber wohl artverwandt wenn ich das beurteilen kann - hilft http://www.c-sharpcorner.com/Lib/MMAPLib.asp
generell wäre aber wohl eine präzisere beschreibung des input-datenformats hilfreich
-
TGGC schrieb:
Quotenmausi schrieb:
also wenn ich auf einem r stehe, welchen Wert hat dann grünen und blauen?
Das ist völlig irrelevant, denn das kannst du später immer noch speichern.
Für mich ist das nicht irrelevant da ich ja die Bilder auch anzeigen möchte und sie sonst nochmals durchlaufen muss was ja wieder Zeit kostet.
Gibts so ein Byte-Weises auslesen eigentlich auch unter OpenGL?
-
Quotenmausi schrieb:
TGGC schrieb:
Quotenmausi schrieb:
also wenn ich auf einem r stehe, welchen Wert hat dann grünen und blauen?
Das ist völlig irrelevant, denn das kannst du später immer noch speichern.
Für mich ist das nicht irrelevant da ich ja die Bilder auch anzeigen möchte und sie sonst nochmals durchlaufen muss was ja wieder Zeit kostet.
Doch, das ist völlg egal, da die g und b Werte ja entweder schon gelesen wurde (und somit schon im Speicher sind) oder später noch gelesen werden. Auf jeden Fall ist das gesamte Bild korrekt im Speicher, nachdem du fertiggeladen hast. Das es _während_ dem Laden Pixel gibt, die noch nicht die korrekte Farbe haben, ist irrelevant (und sowieso unvermeidlich).
Bye, TGGC (Der Held ist zurück)