mikrocontroller.net

Forum: PC-Programmierung MFC: CFile


Autor: domi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Blaubär (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Derartig große Dateien kann man unter Win32 nur mit Memory Mapped-Files 
verwalten (CreateFileMapping etc.)

http://msdn.microsoft.com/library/default.asp?url=...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Blaubär (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
60 MB mit fread oder CFile zu lösen macht nur leider überhaupt keinen 
Sinn, Herr Buchegger!!!

Sagt jedenfalls der Blaubär.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Blaubär (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!!!

Autor: domi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Tipp, das ganze ist nun 30 mal schneller!

Gruß,
Domi

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 60 MB mit fread oder CFile zu lösen macht nur leider überhaupt
> keinen Sinn, Herr Buchegger!!!

Hab ich das gesagt?
domi hatte eine Frage zum Thema Performance Vergleich und
darauf bin ich eingegangen.

Erst mal lesen was wirklich da steht.


Autor: Blaubär (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Danke für den Tipp, das ganze ist nun 30 mal schneller!

>Gruß,
>Domi

@Domi
Danke schön :-)

Gruß vom hilfsbereiten Blaubär (andere stänkern bloß rum!!)

Autor: Mister M (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.