Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » große Dateien lesen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
11.07.2005, 07:57 Uhr
~lilian
Gast


Hallo
ich habe das folgende Code geschrieben um Dateien von der Größe zw. 10 und 200MB aber leider dauert sehr lange . wie kann ich es optimmieren oder gibt´s spezielle Func dafür?Danke

C++:
//********************************************************************************
int readFile()
{
   //-------------- Existenztest der Datei  --------------------------
       char  szfile[50];
       ifstream file;  
       do
       {  
          file.clear();  //clear status flags des Inputstreams "dat"
          cout<<"Dateiname inklusive Pfad eingeben: ";
          cin>>szfile;
            
          file.open(szfile,ios::in); // "dat" wird geöffnet zum Lesen
                                  
          if(file.fail())                     // Fehlertest durchführen  
          cout<<"Datei existiert nicht!"<<endl;
         cout<<"\ndatei is open\n";
       }while(file.fail());
     //-------------------------------------------------------------------
       const string str1="Rec ";
       const string str2= "time_record for";

       do
       {
      
           string strline;    
           int nrow;
           do
           {  
               if(bheader==false)
               {
                  getline(file,strline);
                  if(strline!="")
                  {
                      string sub1 = strline.substr(0,15);

                      if (str2 == sub1)     //  wenn sub1 == "time_record for"  
                      {
                         string sub2= strline.substr(16);
                         v_header.push_back(sub2);    
                      }
              
                      string sub3 = strline.substr(0,4);
                      
                      if (str1 == sub3)         //  wenn sub3 == "Rec "  
                      {
                          getline(file,strline);
                          for (nrow=0;nrow<6; ++nrow)    // nur die zweite und die vierte Zeile lesen
                          {  
                             getline(file,strline);
                             if(nrow==1)
                             {
                            
                                string x;
                                std::stringstream str(strline);
                                str>>x>>x>>x>>x>>x;                                      
                        
                                v_header.push_back(x);    
                                
                             }
                             if(nrow==3)
                             {
                                 string a, b, c, d, x, y;
                                 std::stringstream(strline)>>a>>b>>c>>d>>x>>y;                                      
                            
                                 v_header.push_back(y);    
                                 bheader=true;
                                
                             }

                          }
                    
                      }
                  }
              }
           }while(nrow!=6);

           if (nrow==6)
           {
               int index=0;
               string s;
               do
               {
                   getline(file,strline);
                   for(int k=0;k<15;++k)
                   {
                     s.resize(k+1);
                     s[k]=strline[k];
                   }
                   if (s=="time_record for")
                   {
                     //  printData();
                       string a, b, c;
                       std::stringstream(strline)>>a>>b>>c;                                      
                       v_header.push_back(c);

                       nrow=0;
                       bheader=false;
                       chi++;
                       continue;
                   }

                   string a,b,c,d,e,f;
                   std::stringstream str(strline);
                   str>>a>>b>>c>>d>>e>>f;
                   //if ( !str.empty() )
                   if (a!="" && b!=""&& c!=""&& d!=""&& e!=""&& f!="")
                   {
                       mat_data.resize(chi+1);
                       mat_data[chi].resize(index+6);
                       mat_data[chi][index]   = a;
                       mat_data[chi][index+1] = b;
                       mat_data[chi][index+2] = c;
                       mat_data[chi][index+3] = d;
                       mat_data[chi][index+4] = e;
                       mat_data[chi][index+5] = f;
                       index=index+6;
                   }

               }while(s!="time_record for" && !file.eof());
           }


       }while(!file.eof());
       file.close();
    //   printData();

       return 0;
}

//********************************************************************************
int readFile()
{
   //-------------- Existenztest der Datei  --------------------------
       char  szfile[50];
       ifstream file;  
       do
       {  
          file.clear();  //clear status flags des Inputstreams "dat"
          cout<<"Dateiname inklusive Pfad eingeben: ";
          cin>>szfile;
            
          file.open(szfile,ios::in); // "dat" wird geöffnet zum Lesen
                                  
          if(file.fail())                     // Fehlertest durchführen  
          cout<<"Datei existiert nicht!"<<endl;
         cout<<"\ndatei is open\n";
       }while(file.fail());
     //-------------------------------------------------------------------
       const string str1="Rec ";
       const string str2= "time_record for";

       do
       {
      
           string strline;    
           int nrow;
           do
           {  
               if(bheader==false)
               {
                  getline(file,strline);
                  if(strline!="")
                  {
                      string sub1 = strline.substr(0,15);

                      if (str2 == sub1)     //  wenn sub1 == "time_record for"  
                      {
                         string sub2= strline.substr(16);
                         v_header.push_back(sub2);    
                      }
              
                      string sub3 = strline.substr(0,4);
                      
                      if (str1 == sub3)         //  wenn sub3 == "Rec "  
                      {
                          getline(file,strline);
                          for (nrow=0;nrow<6; ++nrow)    // nur die zweite und die vierte Zeile lesen
                          {  
                             getline(file,strline);
                             if(nrow==1)
                             {
                            
                                string x;
                                std::stringstream str(strline);
                                str>>x>>x>>x>>x>>x;                                      
                        
                                v_header.push_back(x);    
                                
                             }
                             if(nrow==3)
                             {
                                 string a, b, c, d, x, y;
                                 std::stringstream(strline)>>a>>b>>c>>d>>x>>y;                                      
                            
                                 v_header.push_back(y);    
                                 bheader=true;
                                
                             }

                          }
                    
                      }
                  }
              }
           }while(nrow!=6);

           if (nrow==6)
           {
               int index=0;
               string s;
               do
               {
                   getline(file,strline);
                   for(int k=0;k<15;++k)
                   {
                     s.resize(k+1);
                     s[k]=strline[k];
                   }
                   if (s=="time_record for")
                   {
                     //  printData();
                       string a, b, c;
                       std::stringstream(strline)>>a>>b>>c;                                      
                       v_header.push_back(c);

                       nrow=0;
                       bheader=false;
                       chi++;
                       continue;
                   }

                   string a,b,c,d,e,f;
                   std::stringstream str(strline);
                   str>>a>>b>>c>>d>>e>>f;
                   //if ( !str.empty() )
                   if (a!="" && b!=""&& c!=""&& d!=""&& e!=""&& f!="")
                   {
                       mat_data.resize(chi+1);
                       mat_data[chi].resize(index+6);
                       mat_data[chi][index]   = a;
                       mat_data[chi][index+1] = b;
                       mat_data[chi][index+2] = c;
                       mat_data[chi][index+3] = d;
                       mat_data[chi][index+4] = e;
                       mat_data[chi][index+5] = f;
                       index=index+6;
                   }

               }while(s!="time_record for" && !file.eof());
           }


       }while(!file.eof());
       file.close();
    //   printData();

       return 0;
}



Vielen Dank

Dieser Post wurde am 11.07.2005 um 12:36 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
11.07.2005, 12:10 Uhr
ao

(Operator)



C++:
if(nrow==1)
{
    string x;
    std::stringstream str(strline);
    str>>x>>x>>x>>x>>x;                                      
    v_header.push_back(x);    
}
if(nrow==3)
{
    string a, b, c, d, x, y;
    std::stringstream(strline)>>a>>b>>c>>d>>x>>y;                                      
    v_header.push_back(y);    
    bheader=true;
}


Du extrahierst unnötigerweise alle Bestandteile, obwohl du nur das letzte brauchst. Schneller wäre, auf strline von rechts zu suchen.


C++:
mat_data.resize(chi+1);
mat_data[chi].resize(index+6);


Ist mat_data sowas wie vector<vector<string> >? Resize auf Vektoren ist ziemlich teuer, weil der bisher belegte Speicher umkopiert werden muss. Besser: einmal rauskriegen, wie groß mat_data sein muss und alles auf einen Schlag anlegen.

Dann: Müssen die Daten in strings gespeichert werden? Wenn es numerische Daten sind ("mat_data" legt den Verdacht nahe), könntest du auch vorher konvertieren. Unmittelbar bringt das zwar keinen Gewinn, mittelbar aber schon, weil man mit kleineren Speichermengen hantiert (die int-Darstellung einer Zahl ist meist kleiner als eine String-Repräsentation) und weil string intern selber mit dynamischem Speicher arbeitet. Insgesamt ziehst du da also eine ziemlich wilde Speicherorgie ab.

Und was auch noch Zeit kostet: Dateien häppchenweise (Zeile für Zeile) einlesen. Der Datentransfer ist bei größeren Blöcken schneller. Besser wäre also, das ganze File in einen großen Speicherbereich zu holen und dann nur noch aufm Speicher zu arbeiten. Wenn du dann mal kurzfristig 200 MB brauchst, aber dafür zig-mal so schnell fertig bist, ist das ne Überlegung wert, finde ich.

ao

Dieser Post wurde am 11.07.2005 um 12:13 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
11.07.2005, 12:34 Uhr
~lilian
Gast


@ ao
vielen Dank erstmal . ich bin kein c++profi und bin noch am lernen
ao schrieb:

Zitat von Verfasser:

Du extrahierst unnötigerweise alle Bestandteile, obwohl du nur das letzte brauchst. Schneller wäre, auf strline von rechts zu suchen.

wie geht das?
ao schrieb:

Zitat von Verfasser:

Ist mat_data sowas wie vector<vector<string> >? Resize auf Vektoren ist ziemlich teuer, weil der bisher belegte Speicher umkopiert werden muss. Besser: einmal rauskriegen, wie groß mat_data sein muss und alles auf einen Schlag anlegen

mat_data sowas wie vector<vector<string> >? ja
wie groß mat_data ? weiss ich auch nicht das hängt von der einzulesende Datei

ao schrieb

Zitat von Verfasser:

Besser wäre also, das ganze File in einen großen Speicherbereich zu holen und dann nur noch aufm Speicher zu arbeiten


ich weiss auch nicht wie das geht.
ich habe das im internet www.flipcode.com/articles/article_filemapping.shtml gefunden aber
Vielen Dank
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
11.07.2005, 15:39 Uhr
(un)wissender
Niveauwart


Die Frage ist doch überhaupt erstmal, was du tun willst?
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
11.07.2005, 16:35 Uhr
ao

(Operator)



Zitat von ~lilian:
ich bin kein c++profi und bin noch am lernen
...
wie geht das?
...
ich weiss auch nicht wie das geht.

Ich glaube, du solltest erstmal ein bisschen tiefer in C++ einsteigen, bevor du dich mit Aufgaben wie dieser befasst. Solche Von-0-auf-100-Starts gehen mit anderen Sprachen vielleicht noch gut, mit C++ landest du meist schon in den ersten Kurven im Graben.

Die einzelnen Teilbereiche davon (Dateien auslesen, String-Verarbeitung) sind zwar als Einstiegsthemen geeignet, aber nicht in der Komplexität und nicht, wenn auch noch auf Geschwindigkeit optimiert werden soll.

Zum Weitergoogeln: string und ifstream stammen aus der C++-Standard-Bibliothek, vector aus der Standard Template Library. Zum Suchen auf Strings: string::find und string::rfind (von rechts). Zum blockweisen Lesen aus einem Stream, ohne Interpretation der Daten: ifstream::read.

Dein Suchtreffer mit CreateFile usw. ist wieder ein anderes Gebiet, das ist WinAPI (kein C++, sondern C).
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: