Geschwindigkeit verbessern



  • Hallo liebe Community,

    hätte mal eine Frage und zwar habe ich mir ein Programm geschrieben, welches die Anzahl der Zeilen einer formatierten Datei herausgibt und die Zeit misst.
    Leider ist mein Programm bei sehr großen bspw CSV FIles viel zu langsam
    SItze schon seit Tagen daran und komme leider nicht viel weiter.
    Hatte mir überlegt mit Templates zu arbeiten, was sagt ihr ?
    VOrweg danke für die Hilfe 😃

    #include <iostream>
    #include <chrono>
    #include <ratio>
    #include <string>
    #include <fstream>

    int main() {
    std::chrono::time_pointstd::chrono::steady\_clock start,
    stop;
    start = std::chrono::steady_clock::now();

    std::string name;
    std::cout <<"Datei zum Lesen oeffnen: \n";
    std::cin>> name;

    std::string line;
    std::ifstream datei;
    datei.open(name.c_str());

    int i =0;
    while(getline(datei,line))i++;

    std::cout <<"Lines:"<<i<<"\n";

    stop = std::chrono::steady_clock::now();
    auto dur = stop-start;
    std::cout << dur.count() << " ns" << std::endl;//Nanosek.
    std::chrono::milliseconds mil =
    std::chrono::duration_caststd::chrono::milliseconds(dur);
    std::cout << mil.count() << " Milliseconds" << std::endl;
    }



  • Welches Betriebssystem?
    Welcher Kompiler?
    Debug/Release-Mode - mit/ohne Optimierung?
    Wie gross ist die CSV-Datei?



  • Leider ist mein Programm bei sehr großen bspw CSV FIles viel zu langsam

    wie lange (in ms) für wie gross(in MB)?

    Hatte mir überlegt mit Templates zu arbeiten, was sagt ihr?

    In welcher Weise könntest du da Templates anwenden?


  • Mod

    Eine ganz wesentliche Verbesserung wäre, die Zeilen gar nicht erst zu speichern. Du machst ja sowieso nichts damit. Zähl einfach die Anzahl der Zeilenumbrüche in der Datei. Denk dran, dass die Datei eventuell nicht auf einem Zeilenumbruch endet.

    PS: C++-Einzeiler (mit jeder Menge Templates 😉 ):

    auto line_count = std::count(
        std::istreambuf_iterator<char>(file),
        std::istreambuf_iterator<char>(), 
        '\n');
    

    Ich wage mal die Behauptung, dass es keine wesentlich schnellere Lösung geben wird.



  • mit jeder Menge Templates

    hättest doch bestimmt noch mehr einbauen können 🙂



  • Danke Leute
    Mein csv File ist ca 2 GB gross und benutze Windows Code Blocks

    Seppj, der gibt bei mir aus dass Count kein member von Std ist
    Was mache ich da falsch 🙄



  • #include <algorithm>
    

    Codeblocks mit Mingw? Soweit ich weiß ist Code Blocks doch nur eine IDE ohne festen eingebauten Compiler, oder?
    Die Hauptfrage die sich bei Geschwindigkeitsproblemen stellt sind erstmal die Compilerflags. (-O, -O2 o.ä.)



  • Entweder hast du es auch mit einem grossen "C" geschrieben, was schlicht falsch ist, oder du hast vergessen den algorithm Header zu inkludieren.

    Doku: http://en.cppreference.com/w/cpp/algorithm/count

    Edit: Und vielleicht hast du ja auch std mit einem grossen "S" geschrieben - ebenfalls falsch.



  • Oh hatte algorithm vergessen
    Peinlich haha
    Ist echt schneller , danke

    Leute noch eine frage und zwar soll ich eine Schnittstelle programmieren s.d.
    Man mit programmiersprache r mein code über Shell Fenster ansteuern kann
    Weiss da jemand mehr ? 😃


  • Mod

    Servus28 schrieb:

    Leute noch eine frage und zwar soll ich eine Schnittstelle programmieren s.d.
    Man mit programmiersprache r mein code über Shell Fenster ansteuern kann
    Weiss da jemand mehr ? 😃

    Unverständlich. Bitte noch einmal versuchen, mit Fokus auf Grammatik und Kontext.



  • Und zwar will ich mein Code schneller machen lassen.
    Den bei sehr großen CSV Dateien, dauert es zu lange.
    Hab gelesen, dass das Blockweise einlesen der Datei, Performance verspricht
    leider hänge ich auch daran 😞



  • Leute noch eine frage und zwar soll ich eine Schnittstelle programmieren s.d.
    Man mit programmiersprache r mein code über Shell Fenster ansteuern kann

    dafür bitte einen neuen Post erstellen - nicht einfach mitten drinn mit was neuem anfangen

    Und zwar will ich mein Code schneller machen lassen.
    Den bei sehr großen CSV Dateien, dauert es zu lange.
    Hab gelesen, dass das Blockweise einlesen der Datei, Performance verspricht

    Code?

    leider hänge ich auch daran

    in der 1. Zeile oder was ist dein Problem



  • #include <iostream>>
    #include <string>
    #include <fstream>

    int main() {

    std::string name;
    std::cout <<"Datei zum Lesen oeffnen: \n";
    std::cin>> name;

    std::string line;
    std::ifstream datei;
    datei.open(name.c_str());

    int i =0;
    while(getline(datei,line))i++;

    std::cout <<"Lines:"<<i<<"\n";

    }

    damit ist gemeint, dass ich es nicht hinkriege
    die Datei binär einzulesen und die einfach die Zeilenumbrüche zu zählen.
    Somit wäre es schneller als mit while(getline(..))



  • Servus28 schrieb:

    die Datei binär einzulesen und die einfach die Zeilenumbrüche zu zählen.Somit wäre es schneller als mit while(getline(..))

    Dachte SeppJ hat dir das schon irgendwo gezeigt.
    Aus Interesse würde ich mich daran mal versuchen wollen. Kannst du einen Aufbau deiner Datei posten? Sagen wir mal die ersten 10 Zeilen. Und was willst du mit den Daten am Ende machen?



  • Hab es auch leider nicht so hinbekommen 😞

    Hey danke 😃 , sehr lieb von dir

    21221.121,312,1211.121212,3131,12122das
    121.1,121223.122,3312221,de212,11111
    12,331,deas22,2112212.5774,134664
    87655,1313444,1331.313,55fd,453132
    2424,2444.2318,4242frf,6777,1111
    121.1,121223.122,3312221,de212,11111
    12,331,deas22,2112212.5774,134664
    87655,1313444,1331.313,55fd,453132
    2424,2444.2318,4242frf,6777,1111
    65433.2424442424,devvf331,6664,33,1
    .......
    .....

    hat circa 5004312 Zeilen


  • Mod

    cout << "5004312";
    

    Schneller geht's nicht..



  • Oh hatte algorithm vergessen
    Peinlich haha
    Ist echt schneller , danke

    Hab es auch leider nicht so hinbekommen

    ich dachte es wäre jetzt schon schneller - nicht genug
    oder was hast du nicht hinbekommen?

    und das fast gleiche Beispiel vom Anfang einfach noch mal zu posten ist
    ist auch schon grenzwertig



  • Servus28 schrieb:

    Oh hatte algorithm vergessen
    Peinlich haha
    Ist echt schneller , danke

    Wie lange braucht das denn mit SeppJs Ansatz? Wie schnell stellst du dir das vor, sollte es sein?
    Ich stelle auch nochmal die Frage nach den Compiler Flags?!


  • Mod

    Schlangenmensch schrieb:

    Wie lange braucht das denn mit SeppJs Ansatz? Wie schnell stellst du dir das vor, sollte es sein?

    Ich bezweifle, dass er meine Lösung überhaupt ausprobiert hat. Dazu wäre ein Minimum an Eigeninitiative nötig gewesen, da ich kein int main und andere Selbstverständlichkeiten davor geschrieben habe.


Log in to reply