Чтение текстовых файлов и их быстрый анализ с использованием c ++ и увеличение отображаемых файлов памяти

Важное редактирование:
Проблема не в том, что я сказал, после ручного профилирования я понял, что когда я заменяю строку: «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 секунды.

Какие-либо предложения ?
Спасибо

3

Решение

Потоки медленные. Отчасти это связано с обременительными ограничениями, отчасти потому, что реализации имеют тенденцию к плохой оптимизации.

Попробуйте использовать парсеры Boost.Spirit. Хотя к синтаксису нужно привыкнуть, а компиляция иногда может быть очень медленной, производительность Spirit во время выполнения очень высока.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]