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

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

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

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

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

05.05.2014, 14:59. Просмотров 520. Ответов 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 минуты
И что, никто не сталкивался с такой проблемой?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru