Форум программистов, компьютерный форум CyberForum.ru

Слишком медленное чтение wstring из файла - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Обменять элементы двух массивов местами http://www.cyberforum.ru/cpp-beginners/thread1166431.html
Товарищи здравствуйте, помогите с задачей на STL Контейнер Vector. 1. Создать массив из пяти целых чисел. Инициализировать все его элементы случайным числом. Цикл не использовать. 2. Создать второй массив такого же размера. Ввести его элементы с клавиатуры. 3. Обменять элементы двух массивов местами. Цикл не использовать.
C++ Задача на множественное наследование: “Компьютер”, “Сервер”, "ПК", Товарищи, помогите Реализовать следующую систему классов: Класс “Компьютер”. Поля: название, объем оперативной памяти, название видеокарты. Класс “Сервер”. Поля: количество ядер в процессоре, количество каналов связи с интернет, особенности (строка). Класс “Персональный компьютер” – наследуется от класса «Компьютер». Поля: наличие звука, название звуковой карты. Тип мыши (мышь/трекбол).... http://www.cyberforum.ru/cpp-beginners/thread1166428.html
Реализовать класс MyQueue, позволяющий хранить данные любого типа в виде очереди C++
Здравствуйте уважаемые форумчане, помогите с задачей на шаблоны 1. Реализовать класс MyQueue, позволяющий хранить данные любого типа в виде очереди. Реализовать функции: добавления элемента в стек, удаления из стека, проверки состояния очереди (пуста/полна). Переопределить оператор вывода на экран. 2.Найти, в чем отличие class от typename в объявлении шаблона Добавлено через 9 часов 3...
Создать классы исключения, наследуемые от класса std::exception C++
1. Создать класс, описывающий треугольник, как массив из трех точек. Функции: Установка значения точек и вычисление периметра. 2. Создать классы исключения, отнаследованные от класса std::exception. Генерировать исключения в следующих случаях: – Если не выполняется неравенство треугольника – Если три точки лежат на одной прямой.
C++ Классы «Точка» и «Многоугольник»: полиморфизм и перегрузка операторов http://www.cyberforum.ru/cpp-beginners/thread1166404.html
Реализовать класс «Точка» и «Многоугольник». В классе «Точка» присутствуют: 1. два целых числа (X и Y) 2. параметризованный конструктор, деструктор 3. операторы ввода и вывода В классе «Многоугольник» присутствуют: 1. массив точек (10 штук) 2. конструктор (создает массив из трех точек), деструктор 3. операторы ввода и вывода оператор добавления точки к многоугольнику
C++ Арифметическое выражение в виде ПОЛИЗ Дана строка, содержащая запись арифметического выражения в виде ПОЛИЗ. Примем за условие задачи, что: 1. Имя переменной в арифметическом выражении начинается с буквы или знака _; 2. В выражении могут выполняться только операции: +, -, /, * 3. В арифметическом выражении нет вызовов функций; Создайте проект, который вычисляет полученный ПОЛИЗ, используя стек. На экран должно выводиться... подробнее

Показать сообщение отдельно
CAXOPOK
1 / 1 / 0
Регистрация: 29.03.2013
Сообщений: 59

Слишком медленное чтение wstring из файла - C++

05.05.2014, 14:59. Просмотров 503. Ответов 6
Метки (Все метки)

Необходимо прочитать из файла некоторое количество строк(внутри них может содержаться всё что угодно: буквы цифры иероглифы). Строка представляет собой твит-сообщение вида:
[38.276866179999999, -122.03544617] 6 2011-08-28 19:03:01 I'm at Liberty Christian Center (2641 N. Texas Street, Fairfield)
Твиты могут быть многострочные. Возможно наличие ссылок, хештегов.
Её надо разбить на составные части в структуру (геолокация, время отправки, никнейм, и само сообщение) и сохранить в бинарном файле, чтоб в следующий раз (для анализа) не пришлось повторять разбиение в структуру.
Столкнулся уже сразу же с проблемой чтения.
C++
1
2
3
4
wifstream input;
input.open(nameoffile);
vector<wstring> tmp;
copy(istream_iterator<std::wstring, wchar_t, std::char_traits<wchar_t>>(input), istream_iterator<std::wstring, wchar_t, std::char_traits<wchar_t>>(),back_inserter(tmp));
Этот код вроде и работает, но работает очень медленно. Файл на ~300кб и ~2500 строк обрабатывает 30 секунд, а основная задача обработать файл 200мб на 1700000 строк, да и этот алгоритм считывает не по строкам, а разбивает по пробелам.
Изначально делал с использованием Qt, но надо это сделать с STL и не используя сторонних библиотек вроде Boost-а.
Вот что вышло в Qt
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
struct twit
{
    double x;
    double y;
    int year;
    int month;
    int day;
    int hour;
    int minuts;
    int secodns;
    QString sender;
    QString i;
};
 
void createBinaryFile(QVector<twit> & twitBase)
{
 
    QFile input(nameoffile);
    input.open(QIODevice::ReadOnly);
    QString data(input.readAll());
    input.close();
    data.remove(0,1);
    QRegExp exp("\\n\\0133");
    QStringList database = data.split(exp, QString :: SkipEmptyParts);
    twit twitBUF;
    QStringList listBuf;
    foreach(QString str, database)
    {
        listBuf = str.split(", ");
        twitBUF.x = listBuf[0].toDouble();
        listBuf = listBuf[1].split("\t");
        listBuf[0].remove(distance(listBuf[0].begin(),listBuf[0].end())-1,1);
        twitBUF.y = listBuf[0].toDouble();
        listBuf = listBuf[2].split("-");
        twitBUF.year = (listBuf[0]).toInt();
        twitBUF.month = listBuf[1].toInt();
        listBuf = listBuf[2].split(" ");
        twitBUF.day = listBuf[0].toInt();
        listBuf = listBuf[1].split(":");
        twitBUF.hour = listBuf[0].toInt();
        twitBUF.minuts = listBuf[1].toInt();
        listBuf = listBuf[2].split("\t");
        twitBUF.secodns = listBuf[0].toInt();
        listBuf = str.split("\t");
        if(listBuf[3][0] != '@')
        {
            twitBUF.sender = "NULL";
            twitBUF.i=listBuf[3];
        }
        if(listBuf[3][0] == L'@')
        {
 
            listBuf = listBuf[3].split(' ');
            listBuf[0].remove(0, 1);
            twitBUF.sender = listBuf[0];
            listBuf.removeFirst();
            str = listBuf.join(' ');
            twitBUF.i = str;
        }
        twitBase.push_back(twitBUF);
    }
    writeBinaryFile(twitBase);
}
void writeBinaryFile(QVector<twit> &twitBase)
{
    QFile output("G:/output.dat");
    output.open(QIODevice::WriteOnly);
    QDataStream stream(&output);
    stream.setVersion(QDataStream::Qt_5_2);
    foreach(twit tmp, twitBase)
    {
        stream << tmp.x << tmp.y << tmp.year << tmp.month << tmp.day << tmp.hour << tmp.minuts << tmp.secodns << tmp.sender << tmp.i;
    }
    output.close();
}
Вкратце: считываю целиком функцией input.readAll() в строку QString и потом с помощью split разбиваю в QStringList, конвертирую в числа при необходимости, заполняю структуру и добавляю её в QVector. Всё это вместе с записью в бинарный файл занимает около минуты для файла 200мб (1700000 твитов), меня такая скорость устраивала. Но как коснулось, в используя только stl и стандартные средства с++, такая схема не работает: нет ни readall(), ни split().
Подскажите пожалуйста, как хотя бы ускорить чтение до адекватных скоростей.
P.S. извиняюсь за много букв
P.P.S 1 курс, основная задача потом по координатам определить место отправления твита... И это 1 курс и срок 2 недели.

Добавлено через 1 час 40 минут
И никто ничего не подскажет?

Добавлено через 15 часов 4 минуты
И что, никто не сталкивался с такой проблемой?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru