Важное редактирование:
Проблема не в том, что я сказал, после ручного профилирования я понял, что когда я заменяю строку: «file >> x >> y >> z;» со строкой «file.readline (буфер, размер);»
это занимает всего 0,4 секунды, поэтому вопрос совсем в другом, как разобрать числа с плавающей точкой, file >> x >> y >> z;
(я не знаю, должен ли я удалить вопрос или нет, потому что исходный вопрос не имеет значения)
=== СТАРЫЙ ===
После обширных исследований Интернета и переполнения стека я понял, что лучший способ читать большие файлы с помощью c ++ — это использовать файлы с отображением в памяти.
У меня есть текстовый файл, 15 МБ, что в каждой строке 3 плавать, разделенные пробелами.
У меня был этот код:
ifstream file(path)
float x,y,z;
while(!file.eof())
file >> x >> y >> z;
Который мог прочитать этот файл за 9,5 секунд.
Чтобы читать файл быстрее с помощью пользователей stackoverflow, я придумал этот код, что, если я правильно понимаю, он использует файлы, отображенные в памяти, и должен читать его быстрее
Типы потоков в C ++, как читать из IstringStream?
#include <iostream>
#include <boost/iostreams/stream.hpp>
#include <boost/iostreams/device/mapped_file.hpp>
namespace io = boost::iostreams;
int main()
{
io::stream<io::mapped_file_source> str("test.txt");
// you can read from str like from any stream, str >> x >> y >> z
for(float x,y,z; str >> x >> y >> z; )
std::cout << "Reading from file: " << x << " " << y << " " << z << '\n';
}
К сожалению, скорость остается прежней, все еще 9,5 секунды.
Какие-либо предложения ?
Спасибо
Потоки медленные. Отчасти это связано с обременительными ограничениями, отчасти потому, что реализации имеют тенденцию к плохой оптимизации.
Попробуйте использовать парсеры Boost.Spirit. Хотя к синтаксису нужно привыкнуть, а компиляция иногда может быть очень медленной, производительность Spirit во время выполнения очень высока.
Других решений пока нет …