Schnelles lesen von großen Dateien in den Speicher



  • Tachyon schrieb:

    Dann vielleicht so als primitiver Ansatz:

    [quote="SeppJ"So geht das:[/quote]

    Habe jetzt mal beide Ansätze ausprobiert und alle laufen ungefähr gleich schnell. Der cast von 10.000 double Werten scheint nicht so schnell zu sein.

    Zumindest zeigt der Profiler dass getline() so gut wie keine Zeit mehr kostet.

    Danke für eure Hilfe !



  • wm schrieb:

    Tachyon schrieb:

    Dann vielleicht so als primitiver Ansatz:

    Habe jetzt mal beide Ansätze ausprobiert und alle laufen ungefähr gleich schnell. Der cast von 10.000 double Werten scheint nicht so schnell zu sein.

    Zumindest zeigt der Profiler dass getline() so gut wie keine Zeit mehr kostet.

    Danke für eure Hilfe !

    Hmm, 10000 Werte merkt man bei mit gar nicht. Die sind quasi instant verfügbar. Arbeitest Du im Debug-Modus?

    Außerdem könntest Du noch irgendwie so versuchen, direkt in die Matrix zu lasen:

    bool is_whitespace(char c)
    {
        std::locale loc;
        return std::isspace(c, loc);
    }
    
    int main()
    {
        std::ifstream reader("N_rand_10k_x_10k.txt");
        //Anzahl Zeilen
        std::istreambuf_iterator<char> end;
        std::istreambuf_iterator<char> i(reader.rdbuf());
        std::size_t rows = std::count(i, end, '\n');
        reader.seekg(0);
        //Anzahl Spalten
        std::string line;
        std::getline(reader, line);
        std::size_t cols = 1 + std::count_if(line.begin(), line.end(), is_whitespace);
        reader.seekg(0);
        //Matrix erstellen
        typedef boost::numeric::ublas::matrix<double> matrix_type;
        typedef boost::numeric::ublas::matrix_row<matrix_type> matrix_row_type;
        std::size_t current_row = 0;
        matrix_type m(rows, cols);
        matrix_row_type row(m, current_row);
        std::size_t current_col = 0;
        //Einlesen
        while( (current_row + 1) < m.size2() && (reader >> row[current_col]))
        {
            ++current_col;
            if(current_col == cols)
            {
                current_col = 0;
                ++current_row;
                row = matrix_row_type(m, current_row);
            }
        }
    }
    


  • Tachyon schrieb:

    Hmm, 10000 Werte merkt man bei mit gar nicht. Die sind quasi instant verfügbar. Arbeitest Du im Debug-Modus?

    Ich meine 10000 casts je Zeile. Auf meinem NB sind es etwa 100 Zeilen je Sekunde.


  • Mod

    Hast du eigentlich mal einen Profiler benutzt, was da so langsam ist? Oftmals ist das Ergebnis recht überraschend.



  • SeppJ schrieb:

    Hast du eigentlich mal einen Profiler benutzt, was da so langsam ist? Oftmals ist das Ergebnis recht überraschend.

    Ja, im Moment ist es das lexical_cast ... getline braucht < 5% soweit ich es noch in Erinnerung habe.


  • Mod

    wm schrieb:

    SeppJ schrieb:

    Hast du eigentlich mal einen Profiler benutzt, was da so langsam ist? Oftmals ist das Ergebnis recht überraschend.

    Ja, im Moment ist es das lexical_cast ... getline braucht < 5% soweit ich es noch in Erinnerung habe.

    Ja, Zahlen parsen ist eben langsam. Wenn das Format nicht zu ungewöhnlich ist, kannst du ja mal das gute alte atof ausprobieren.


Anmelden zum Antworten