MFC: CFile

Gast #471694
Lesenswert?

Hallo,

ich habe eine 60 MB Datei, die ich Byte für Byte durchsuchen muss. 
Momentan arbeite ich mit der Klasse CFile aus der MFC und lese jedes 
Byte einzeln mit Read() aus der Datei.
Ist ein großer Performancegewinn zu erwarten, wenn man die komplette 
Datei zunächst in einen Puffer läd und darauf arbeitet? Oder öfter 
größere Blöcke? Gibt es sonst Möglichkeiten das ganze zu beschleunigen? 
Sind die "alten" Datei-Zugriffsfunktionen z.B. fread schneller als die 
der Klasse CFile?

Gruß,
domi
#471989
Lesenswert?

Um auf die ursprüngliche Frage zurückzukommen:
Nein, Performancegewinn ist keiner zu erwarten. So blöd
sind die Entwickler der I/O Libraries auch wieder nicht,
dass sie nicht selbst Buffer einbauen.

> Sind die "alten" Datei-Zugriffsfunktionen z.B. fread schneller
> als die der Klasse CFile?

CFile stützt sich letztendlich auf die selben Basisfunktionen
wir auch fread(). Da aber bei fread der ganze Klassenüberbau
wegfällt, ist das wahrscheinlich einen Tick schneller.
Persönliche Seite #472071
Lesenswert?

... der einfach keine Ahnung hat, so leid es mir tut.

Selbstverständlich kann man 60 MB mit fread (bzw. dem CFile-Wrapper) in 
den Speicher einlesen, sogar mit einem einzigen Aufruf, und dann lässt 
sich im Speicher nach den erforderlichen Daten suchen.  Man kann auch 
byteweise lesen (was die performance allerdings in der Tat erheblich 
senken dürfte), oder in 1 KB-Blöcken, oder wie auch immer.

Sicher, mit "memory mapped files" geht das auch, aber eben nicht 
nur. Was für ein Blödsinn.

Naja, kommt das "Blau" im "Blaubär" vom C2H5OH-Gehalt?
Gast #472098
Lesenswert?

@Rufus
Es wird auch nicht bestritten, daß man auch mit fread() 60 MByte auf 
einen Schlag einlesen kann. Aufgrund der desolaten Performance macht das 
aber überhaupt keinen Sinn (nur DAUs würden das machen), weshalb die 
Verwendung von Memory Mapped Files angebracht ist!!!
Gast #1008398
Lesenswert?

Also:

Es macht natürlich Sinn, Dateien in "verdaulichen" Mengen einzulesen und 
nicht etwa Byte für Byte. Je nach Applikation, ist die Größe des zu 
benutzenden Puffers dann zu wählen (z. B. in 4 MB -Häppchen). Mit 
fileseek kann man sich die Datei scheibchenweise einlesen und auswerten. 
Wenn ein Durchlauf mehr als 1x pro Datei nötig ist, würde man die 
gesamte Datei (möglicherweise) einlesen.

Auf die Windows-Funktionen ala "Memory Mapping" würde ich mich nicht 
immer verlassen. In einigen Konstellationen kann das Betriebssystem u. 
U. lahmgelegt werden (z.B. bei Dateien, die Größer sind, als der zur 
Verfügung stehende Arbeitsspeicher). Dies ist regelmäßig unter WIN2k zu 
beobachten, leider aber auch unter WinXP. Entweder schreibt man einen 
eigenen File-Wrapper, der den Zugriff auf die Datei über einen eigenen 
(selber konfigurierbaren) Cache regelt, oder man bedient sich einer der 
zahlreichen Hilfsklassen, die wesentlich bequemer sind, als die 
MFC-Bordwerkzeuge. Ein Blick bei Codeguru bewirkt Wunder.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren