Dateien TURBO-lesen???



  • Hey Leudde!
    Sagt mal, weis jemand von euch, ob man eine Binärdatei zeichenweise auch "turbo"-lesen kann??? Also ich meine das so: Eine while-Schleife soll solange jeweils ein Zeichen aus der Datei lesen bis dieses einem zuvor festgelegtem Stop-Zeichen entspricht.

    Also z.B. steht in der Datei

    This is a text.
    

    Das Programm soll bis zum Punkt lesen:

    string text;
    char ch;
    while (ch != '.')
    {
        infile.get(ch);
        if (infile.eof()) break;
        text = text + ch;
    }
    

    Gibt es vielleicht eine Möglichkeit, diesen Vorgang um ein paar sekundenbruchteile zu beschleunigen???

    Gruss, code_pilot 😕



  • <nicht ISO C++>Ja, du nimmst keine C++ Streams, da die einen internen Buffer verwenden, sondern direktes System I/O, liest die Datei mit einen Schlag in den RAM in einen Buffer und durchsuchst den nach '.'.</nicht ISO C++>

    <ISO C++>vielleicht bringt es etwas, wenn du mit einem Rutsch die Daten liest und den += Operator benutzt. Außerdem geben Binär Dateien AFAIK kein EOF</ISO C++>

    [ Dieser Beitrag wurde am 30.10.2002 um 20:43 Uhr von kingruedi editiert. ]



  • hmmm....also nicht die fstream benutzen, sondern sowas wie in der io.h mit open und close? Werds mal ausprobieren, thx



  • ne wenn schon platform spezifisch, dann richtig mit windows.h
    Oder du lädst dir z.B. die wxWindows Bibilothek runter, damit gehts schnell UND portabel 🙂



  • Könntest du mir mal ein kleines Beispiel geben??? Wie kann man denn mit der WinAPI Files auslesen?? Obwohl, ich könnte ja mal in den Petzold gucken...



  • am schnellsten würde es mit memory mapped files gehen, dann bekommst du nen pointer auf den anfang der datei und machst nur while(pt++!='.');

    wenn du das file als read only machst, bekommst du die meißte performance.

    aber wieviel MB mußt du denn durchsuchen, dass es so zeitkritisch wird?

    rapso->greets();



  • Wie wäre es mit Assembler?



  • Original erstellt von HAR:
    Wie wäre es mit Assembler?

    witzbold



  • Original erstellt von HAR:
    Wie wäre es mit Assembler?

    Ich bevorzuge direkte Machinensprache.



  • Sehr optimieren kann man das ganze schon, wenn man immer DWORD-Werte oder sogar QWORD-Werte ausliest



  • Original erstellt von rapso:
    **am schnellsten würde es mit memory mapped files gehen, dann bekommst du nen pointer auf den anfang der datei und machst nur while(pt++!='.');

    wenn du das file als read only machst, bekommst du die meißte performance.
    aber wieviel MB mußt du denn durchsuchen, dass es so zeitkritisch wird?
    **

    Hi rapso!
    Die Datei ist nicht gross, so ~250 kB, es geht mir nur darum, dass sie schnell geparst werden kann.
    Hört sich aber gut an mit dem memory mapping, wie öffne ich den so eine gemappte Datei???

    Gruss, code_pilot 🙄



  • Also bei 250kb würde ich mir absolut keine Sorgen machen. 🙂

    Oder hast du zweifelsfrei nachgewiesen, dass der Flaschenhals in deinem Code wirklich an dieser Schleife hängt? Normalerweise liegt der Engpass woanders.

    Ich würde die ganze Datei einfach in einen string oder vector<char> einlesen, und diesen dann durchsuchen. Das wirst du auch mit Memory mapped Files nicht schneller hinkriegen (zumindest bei so kleinen Dateien).



  • Original erstellt von code_pilot:
    **```cpp
    string text;
    char ch;
    while (ch != '.')
    {
    infile.get(ch);
    if (infile.eof()) break;
    text = text + ch;
    }

    Liest die Schleife Zeilenweise oder einzelne chars?
    Wäre sinnvoller, mehrere chars auf einmal zu lesen, das spart Zugriffszeit der Festplatte / CDROM / Diskette



  • Original erstellt von cd9000:
    **
    Ich würde die ganze Datei einfach in einen string oder vector<char> einlesen, und diesen dann durchsuchen. Das wirst du auch mit Memory mapped Files nicht schneller hinkriegen (zumindest bei so kleinen Dateien).**

    Hi!
    Ahja, also lese ich das ding einmal ins Memory und else es da aus! Verstehe, ich glaube das bringt mich schon um einiges weiter, besten Dank 🙂

    code_pilot 😮


Anmelden zum Antworten