Performance Textdatei einlesen



  • Hallo Gemeinde,

    ich muß in einem Softwareprojekt eine Datei im Textmodus einlesen welche auch mehrere Megabyte groß sein kann. Da die Perfomance nicht unwichtig ist, würde mich mal Eure Erfahrungen dazu interessieren, was schneller ist:

    A) Einlesen mit fread
    😎 Einlesen mit streams (get....)

    Gruß
    Olli



  • Mach es doch direkt auf API-Ebene deines Betriebssystems, wenn es wirklich schnell sein muss.



  • bei a) ist O(e(ln(sqrt(1-x2))))
    bei b) dagegen nur O(e^(ln(ln(1/x))))

    also b!



  • Hallo...,

    @Dirk:
    Ich möchte schon plattformunabhängig bleiben.
    @Algorithmiker
    Hallo? Wie untermauerst du deine e-Funktion? Ich glaube gerne deine Behauptung, aber gehts auch für Nichtmathematiker? 🙂 Vielleicht etwas sprechender?

    Gruß
    Olli



  • hmm also ich würd vorschlagen du nimmst ne quarz uhr oder ähnliches und guggst druff

    /* fread example: read a complete file */
    #include <stdio.h>
    #include <stdlib.h>
    
    int main () {
      FILE * pFile;
      long lSize;
      char * buffer;
    
      pFile = fopen ( "myfile.txt" , "rb" );
      if (pFile==NULL) exit (1);
    
      // obtain file size.
      fseek (pFile , 0 , SEEK_END);
      lSize = ftell (pFile);
      rewind (pFile);
    
      // allocate memory to contain the whole file.
      buffer = (char*) malloc (lSize);
      if (buffer == NULL) exit (2);
    
      // copy the file into the buffer.
      fread (buffer,1,lSize,pFile);
    
      /*** the whole file is loaded in the buffer. ***/
    
      // terminate
      fclose (pFile);
      free (buffer);
      return 0;
    }
    

    oder hier

    // istream get
    #include <iostream>
    #include <fstream>
    using namespace std;
    
    int main () {
      char c, str[256];
      ifstream is;
    
      cout << "Enter the name of an existing text file: ";
      cin.get (str,256);
    
      is.open (str);        // open file
    
      while (is.good())     // loop while extraction from file is possible
      {
        c = is.get();       // get character from file
        cout << c;
      }
    
      is.close();           // close file
    
      return 0;
    }
    


  • @OlliNRW: Ich bin nur ein dummer Troll. War alles Blödsinn.
    Die Groß-O-Notation für Komplexitäten gibt es aber wirklich. Ist schon interessant. Es gibt da ja auch viel einfaches, z.B. O(n), O(n^2), O(log(n))...



  • also mein rechner macht beides bei wenigen mb in wenigen sekunden ich denke ...
    bei dir wirds auch net anderst sein 🙂 und wenn doch mach multithreads splitte die datei und mach n ma eine der funktionen 😉



  • 1ntrud0r:

    deine beiden sources sind nicht gleich.
    variante 1 ist wesentlich schneller - denn du liest ALLES auf einmal. was bei Variante 2 nicht der Fall sein muss.

    in großen stücken lesen ist immer besser als in kleinen.
    (sofern man auch die ganze datei braucht ;))



  • Hallo 1ntrud0r,

    danke für deine Hilfe. Ich denke es wird wahrscheinlich rel. egal sein, ich machs dann mit den Streams. Wäre ja noch interessant welche Dateigrößenbestimmnung schneller ist:

    A) mit stat (_stat)
    oder
    😎 .seekg/.tellg

    Wahrscheinlich auch egal, es sei denn der Algorithmiker hat schon wieder eine tolle Formel parat. 😉

    Gruß
    Olli


Anmelden zum Antworten