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.
-
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.
-
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.