Filpointer immer am Anfang: ineffizient?



  • Hallo!

    //..
    ifstream t_sStreamInTmp(Datei.c_str(),ios::in|ios::binary);
    if(!t_sStreamInTmp.good())
      cout << "\n File not found. " << endl;
    
    register int i,j;
    for(i=0;i<25;++i){
     ClassPointst *t_pcPoint = NULL;
     if(/*Bedingung*/){
          t_pcPoint = new ClassPoint[Anzahl];
          for(j=0;j<Anzahl;++j){
    	t_sStreamInTmp.seekg(BytePosition[i][j],ios::beg);
          }
     // ....
     }
    }
    //...
    

    Wäre es vielleicht geschickter/schneller anstatt ios::beg ios::cur zu benutzen?
    also

    t_sStreamInTmp.seekg(BytePosition[i][j]-BytePosition[i][j-1],ios::cur);
    

    Ist mein Programm ineffizient wenn ich den Filepointer immer wieder an den Anfang setze?

    mfg



  • ga_un schrieb:

    Ist mein Programm ineffizient wenn ich den Filepointer immer wieder an den Anfang setze?

    Ja, wozu willst du denn sowas??



  • @shade

    z.b. weil man sowas wie ich macht weil das schließen zu lahm ist?

    http://www.c-plusplus.net/forum/viewtopic.php?t=77050



  • Anders gefragt:
    bei Verwendung von seekg(BytePos,ios::beg) geht der Filepointer erst an den Anfang der Datei und bewegt dann den Zeiger BytePos-offsets weiter.
    Ist das zeitaufwendig, wenn der filepointer immer hin und her springt?



  • @Konvertierer:
    Kapier ich nicht was dir das bringt... Wenn du soviele Dateien hast, dann musst du doch sowieso jede Datei öffnen und schliessen...

    ga_un schrieb:

    Ist das zeitaufwendig, wenn der filepointer immer hin und her springt?

    Ja. Denn die streams sind nicht auf das seeken ausgelegt.
    Da geht zB jedesmal die ganze pufferung flöten...



  • @shade

    ich versuchs noch einmal zu erklären:

    Dú hast eine Datei

    bla
    blubb
    test
    hallo
    du
    er
    sie
    hallo

    und davon so ca. 1000 Stück und mehr. Jetzt sollst du in jeder Datei z.b. nach doppelten einträgen suchen, nach bestimmten wörtern usw.

    Erste möglichkeit:
    Du schreibst eine Funktion

    void Suche_Doppelte_Eintraege()
    {
     // datei öffnen
    
     // suchen
    
     // datei schließen
    }
    

    dann

    void Suche_Wort()
    {
     //datei öffnen
    
     // suchen
    
     //schließen
    }
    

    D.h. du untersuchst jede der über 1000 Dateien auf meinetwegen 50 verschiedene sachen, du öffnest sie in jeder funktion wieder und schließt sie wieder.
    Und das schließen dauert aber so dermaßen lange das du sie nicht schließt sondern in jeder Funktion einfach wieder auf die 0te Position springst weils echt schneller geht.

    Wie in dem anderen Thread gefragt, für eine bessere variante bin ich immer zu haben!



  • Ich habs immernoch nicht kapiert. Weil du ja die Datei trotzdem irgendwie schliessen und die nächste öffnen musst...

    Vielleicht steh ich auch auf der Leitung

    Konvertier schrieb:

    Wie in dem anderen Thread gefragt, für eine bessere variante bin ich immer zu haben!

    Memory Mapping.

    Du mappst die Datei in einem rutsch in den Speicher, mmap() und CreateFileMapping() für Unix/Windows (wenn ich nicht irre)

    Denn du scheinst die streams für etwas zu verwenden, für das sie nicht gemacht wurden.



  • keine Ahnung was du sonst noch für Funktionen bereitstellen möchtest. Aber du könntest, zb. jede Datei sortieren. Dann kannst du schneller Wörter finden und auch doppelte Einträge etc. Du könntest auch noch mehr Informationen halten, zb. kann jedes Wort eine Zahl dahinter haben die angibt wie oft es in dieser Datei vorkommt etc.
    Dann die Datei nur einmal öffnen und jede Operation drauf anwenden die du auf diese Datei anwenden möchtest, also dieser öffnen schließen Kram in jeder Funktion. Und mit den ungepufferten Streams, gibt nich auch gepufferte?

    Shade
    *****

    er öffnet die datei jedesmal wenn er eine Funktion aufruft, so hab ich das verstanden.

    tschöö

    tt



  • Gut das ich noch nicht weiter gearbeitet habe sondern erstmal frage 😉

    Du bist schon nah dran,

    Ich habs immernoch nicht kapiert. Weil du ja die Datei trotzdem irgendwie schliessen und die nächste öffnen musst...

    Sicher, ich muss 1000x eine Datei öffnen und schließen.

    Du meintest jetzt aber man soll nicht mit dem filepointer einfach an den anfang einer datei springen. Jetzt fällt mir aber keine andere methode ein wieder zum Anfang zu gelangen außer in jeder Funktion jede Datei zu öffnen und wieder zu schließen.

    D.h.
    50 Funktionen, 1000 Dateien = 50000 mal öffnen und schließen statt nur 1000x wenn ich den filepointer auf 0 setze.

    Bitte sag mir wenn ich da was grundlegendes falsch mache, dass ist mir total wichtig!



  • @thetester das mit dem schließen war auch meine idee, hier der code:

    unsigned int CAnalyze::Check_Players() 
    { 
        for(int i=0; i<vplayer.size(); ++i) 
        { 
            //Dateien öffnen 
    
            // Funktion ausführen 
    
            playerLogfile.clear(); 
            playerLogfile.seekg(0); 
    
                      // Funktion ausführen 
    
            playerLogfile.clear(); 
            playerLogfile.seekg(0); 
    
                      // Funktion ausführen 
    
            // Dateien schließen 
        } 
        return(1); 
    }
    

    Ich weiß halt nicht wie es noch besser geht!



  • wie gross sind deine Dateien ?
    wenn du die daten von 2 dateien gleichzeitig im Speicher haellst, bekommst du dann Ressourcenprobleme ?

    Ciao ...



  • @RHBaum

    gute Frage, theoretisch ist es so: Es läuft eine Übung ab und diese wird in einem Riesenfile protkolliert (bis die platte voll ist, also gigabytegröße....)

    Weil man mit einer nicht arbeiten kann spalte ich diese auf, für jeden teilnehmer eine.

    Bei einem 400 mb file was ich gerade immer teste sind das so pro spieler 4-18 mb .

    Könnte also passen das ich 2 im speicher halte



  • Aso, du willst jede Datei 50mal öffnen... Sag dass doch gleich 😉

    Dann ist das seek natürlich angebracht. Frage ist nur, ob man das wirklich braucht. Kann man die Datei denn nicht einfach nur einmal durchgehen??

    Naja, File Mapping ist da aber sicher die beste möglichkeit - da hat man das seek mit ner pointer addition (bzw. subtraktion) erledigt.



  • Ich hab jetzt mal darüber nachgedacht, theoretisch könnte ich ja eine Datei öffnen und in einem vector speichern und dann arbeiten die Funktionen mit dem Vector, d.h. das springen mit dem pointer würde entfallen.

    Aber wäre das denn auch schneller?


Anmelden zum Antworten