Datei schneller einlesen
-
Mein Tipp wäre auch das zeilenweise Einlesen der Datei zu umgehen und möglicherweise noch auf den vector "tokens" zu achten, denn wenn der so nach und nach gefüllt wird, muss er seine Größe anpassen und wir wissen ja wie "zeitraubend" die vector-Klasse das im Allgemeinen macht.
-
Ich brauche die Werte als float um mit ihnen weiterzuarbeiten.
Das Programm läuft bereits im Release-Modus, die Datei die ich im ersten Post als Beispiel angegeben habe war nur ein kleines Beispiel andere Bilder sind ca. 4000x4000 Pixel groß.
Das mit dem vector ist eine gute Idee, die Größe kann ich ja aus dem Header schon herauslesen und dann entsprechend mit mit reserve die Größe reservieren.
-
Auch wenn du sie später als floats brauchst, kannst du keine floats parsen wo keine sind, was du aber versuchst.
-
Das Beispiel aus dem ersten Post ist ungünstig gewählt es stehen einfach nur Zahlen in der Datei nicht Hexadezimal dargestellt und nicht unbedingt 8Bit sondern so groß wie der maximale Grauwert im Header festgelegt ist.
-
Das Codebeispiel ist alles andere als effizient. Es werden beispielsweise viele unnötige Allokationen gemacht.
Ich würde einen richtigen Parser dafür schreiben. Das ist das zuverlässigste und schnellste.
-
Saug doch die Werte komplett in ein char Array:
int main() { int base = 16; char* p, *eptr; unsigned long num; char datei_inhalt[] = "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00" "00 03 03 03 03 00 00 07 07 07 07 00 00 0b 0b 0b 0b 00 00 0f 0f 0f 0f 00" "00 03 00 00 00 00 00 07 00 00 00 00 00 0b 00 00 00 00 00 0f 00 00 0f 00" "00 03 03 03 00 00 00 07 07 07 00 00 00 0b 0b 0b 00 00 00 0f 0f 0f 0f 00" "00 03 00 00 00 00 00 07 00 00 00 00 00 0b 00 00 00 00 00 0f 00 00 00 00" "00 03 00 00 00 00 00 07 07 07 07 00 00 0b 0b 0b 0b 00 00 0f 00 00 00 00" "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"; p = datei_inhalt; while(*p) num = strtoul (p, &eptr, base), printf("%lu ", num), p = eptr+1; return 0; }Wenns ums schnelle Einlesen geht, wäre es vllt. besser, wenn du
ein anderes Dateiformat benutzen würdest.
Gruß,
B.B.
-
Verflixt, wie kommt die 1 da rein?

So sollte es nun stimmen:while(*p) num = strtoul (p, &eptr, base), printf("%lu ", num), p = eptr;War das nun Zufall, das der Code vorhin auch mit der 1 richtig lief; das also zufällig *p == 0 war, als ich es nochmal getestet habe

Naja, auch Wurscht jetzt.
-
Wenn ich richtig verstehe, worauf das ganze hinausläuft, warum nicht stumpf
#include <algorithm> // copy #include <iterator> // istream_iterator, back_inserter // ... std::vector<unsigned char> image_data; datei.setf(std::ios::hex); std::copy(std::istream_iterator<int>(datei), std::istream_iterator<int>(), std::back_inserter(image_data));oder etwas in der Art?
Natürlich wird das ganze bedeutend schneller, wenn du (was ich annehme) aus den Header-Daten die Anzahl der Werte entnehmen und vorher per
image_data.reserve(anzahl_werte);oder so genug Speicher anfordern kannst.
-
Also, vergiss den ganzen Müll von vorher, wenn du es schnell haben willst. Nimmt die binär Version von PGM (was du ja sowieso hat, wenn ich deine Beschreibung Hex-Darstellung richtig versteh). Laut http://netpbm.sourceforge.net/doc/pgm.html sind die Pixeldaten immer 1 oder 2 byte groß und MSB ist vorn. Also machst du dir ein Array/Vector von unsigned char bzw. unsigned short oder was bei deinem System 1 bzw. 2 Byte groß ist. Dann kannst du mit fstream.read alles auf einmal in das Array einlesen. Jetzt hast du die Zahlen im Array ohne dieses lahme stringstream Gedönse. Wenn du jetzt noch float willst, gehst du das Array durch und castest nach float.
PS: Geht natürlich nur, wenn auf deinem System 1 Byte 8 Bit groß ist, was aber auf 99,99999999999999999999999994165284% der User hier zutrifft.
-
HighendCoder schrieb:
PS: Geht natürlich nur, wenn auf deinem System 1 Byte 8 Bit groß ist, was aber auf 99,99999999999999999999999994165284% der User hier zutrifft.
Haeh? Es sind noch 3000 Meter zu laufen. Das gilt aber nur, wenn in deinem Land auch 1 Kilometer = 1000 Meter gilt.
-