Russian Qt Forum
Ноябрь 26, 2024, 02:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3 4   Вниз
  Печать  
Автор Тема: Организация произвольного построчного чтения  (Прочитано 19188 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #15 : Июль 19, 2013, 17:41 »

Проверил у себя, последний тест:
То что великий и могучий std сэкономил мне аж одну(!) строку не компенсирует того что подход неверен в принципе. Возьмем структурку поприличнее, у меня разницв в 20 раз, (не привожу цифры из соображений тактичности  Улыбающийся)

Код
C++ (Qt)
#include <iostream>
#include <algorithm>
#include <QtGUI>
 
struct CData {
CData( void )
{
vec.resize(10);
std::fill(vec.begin(), vec.end(), "test");
}
 
std::vector <std::string> vec;
};
 
int main()
{
const int Num = 1000 * 1000;
QList <CData> list;
for (int i = 0; i < Num; ++i)
list.push_back(CData());
 
qsrand(0);
QTime t2 = QTime::currentTime();
int limit = list.size();
for (int i = 0; i < limit; ++i)
list.swap(i, qrand() % limit);
std::cout << "igors: " << t2.elapsed() << " ms." << std::endl;
 
srand(0);
QTime t1 = QTime::currentTime();
std::random_shuffle(list.begin(), list.end());
std::cout << "random_shuffle: " << t1.elapsed() << " ms." << std::endl;
 
   return 0;
}
 
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #16 : Июль 19, 2013, 17:43 »

В списке (колонке) 100.000 пунктов. Тормозить не будет?
Нет, не забудьте только вызвать qsrand до того, иначе каждвй раз результат перемешивания будет новый
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #17 : Июль 19, 2013, 17:51 »

Проверил у себя, последний тест:
Возьмем структурку поприличнее, у меня разница в 20 раз, (не привожу цифры из соображений тактичности  Улыбающийся)

В 20 раз? У Вас либо какая то сильно кривая stl, либо она на вас держит зуб)

У меня результаты такие:
Код
Bash
igors: 226 ms.
random_shuffle: 736 ms.
 

одного порядка..
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #18 : Июль 19, 2013, 17:59 »

иначе каждвй раз результат перемешивания будет новый
одинаковый он будет.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #19 : Июль 19, 2013, 18:07 »

компилятор от студии 2012, процессор i7-2600K 3.4 GHz, release сборка:
Цитата: Qt 4.8.5 x86
igors: 14 ms.
random_shuffle: 864 ms.
Цитата: Qt 5.1 x64
igors: 15 ms.
random_shuffle: 741 ms..
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #20 : Июль 19, 2013, 18:09 »

компилятор от студии 2012, процессор i7-2600K 3.4 GHz, release сборка:
Цитата: Qt 4.8.5 x86
igors: 14 ms.
random_shuffle: 864 ms.
Цитата: Qt 5.1 x64
igors: 15 ms.
random_shuffle: 741 ms..

Понятно всё..
В c++11 у std::vector есть move конструктор и move assignment оператор. Этим всё объясняется..
« Последнее редактирование: Июль 19, 2013, 18:12 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Spark
Гость
« Ответ #21 : Июль 19, 2013, 18:14 »

В списке (колонке) 100.000 пунктов. Тормозить не будет?
Нет, не забудьте только вызвать qsrand до того, иначе каждвй раз результат перемешивания будет новый
А остальные пункты верны? Т.е в целом правильно понял и двигаться в этом порядке? Если да, то для меня сейчас важен второй пункт - как перегнать текст в QStringList? Тема для меня относительно новая.
Т.е. надо организовать цикл как в предыдущей теме и добавлять пункты, что то вроде этого?:
Код
C++ (Qt)
           QStringList lst;
           do
           {
               itemStr = fileStream.readLine();
               trimmedStr = itemStr.trimmed();
               lst = +trimmedStr;
           } while( !fileStream.atEnd() );
Записан
Spark
Гость
« Ответ #22 : Июль 19, 2013, 18:33 »

Или так:
Код
C++ (Qt)
   QStringList lst;
   while(!fileStream.atEnd())
   {
       lst.append(fileStream.readLine());
   }
« Последнее редактирование: Июль 19, 2013, 18:35 от Spark » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #23 : Июль 19, 2013, 18:45 »

Вы и дальше собираетесь всё методом  тыка постигать?


Код
C++ (Qt)
   QFile file("in.txt");
   if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
        return;
 
    QTextStream in(&file);
    QStringList list = in.readAll().split(QRegExp("[\\s\n]"), QString::SkipEmptyParts);
 


« Последнее редактирование: Июль 19, 2013, 19:07 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #24 : Июль 19, 2013, 19:07 »

не слишком будет сурово для ста тысяч строк? построчно читать пооптимальнее будет. где-то помню даже была тема, где сравнивались разные подходы к чтению большого текстового файла.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #25 : Июль 19, 2013, 19:17 »

не слишком будет сурово для ста тысяч строк? построчно читать пооптимальнее будет. где-то помню даже была тема, где сравнивались разные подходы к чтению большого текстового файла.

Думаете сто тысяч это много?

Сейчас проверим..
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Spark
Гость
« Ответ #26 : Июль 19, 2013, 19:31 »

Спасибо! Вроде как перегнать удалось настроить. 100.000 считывает вроде мгновенно. Теперь организовать разобраться с считыванием с QStringList и можно буде проверить с реальными 100.000 слайдами и вообщее рандомит ли Улыбающийся.
До утра еще время есть у меня. Час 2-3 Улыбающийся.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #27 : Июль 19, 2013, 19:39 »

не слишком будет сурово для ста тысяч строк? построчно читать пооптимальнее будет. где-то помню даже была тема, где сравнивались разные подходы к чтению большого текстового файла.

Думаете сто тысяч это много?

Сейчас проверим..

Вобщем создал файлик 100000 строк.. Размер порядка 1 метра. Короче, на таких объёмах можно пока не беспокоиться)  
« Последнее редактирование: Июль 19, 2013, 22:22 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Spark
Гость
« Ответ #28 : Июль 19, 2013, 20:21 »

Спасибо! Разобрался. Проверил два варианта:
Код
C++ (Qt)
           if ( file.open( QFile::ReadOnly | QIODevice::Text ) )
           {
 
               QTextStream fileStr( & file );
 
               QStringList list = fileStr.readAll().split(QRegExp("[\\s\n]"), QString::SkipEmptyParts);
 
               for (int i = 0; i < list.size(); ++i)
                list.swap(qrand() % list.size(), qrand() % list.size());
 
               foreach (QString itm, list)
               {
                   if(slideShowPopupAction->isChecked())winPopup->slideTranslationFor( itm );
 
                   QEventLoop loop2;
                   QTimer::singleShot(cfg.preferences.slideShowTimer, &loop2, SLOT(quit()));
                   loop2.exec();
               }
               file.close();
           }


Код
C++ (Qt)
           if ( file.open( QFile::ReadOnly | QIODevice::Text ) )
           {
 
               QTextStream fileStr( & file );
               QStringList list;
 
               while(!fileStr.atEnd())
               {
                   list.append(fileStr.readLine());
               }
 
               for (int i = 0; i < list.size(); ++i)
                list.swap(qrand() % list.size(), qrand() % list.size());
 
 
               foreach (QString itm, list)
               {
                   if(slideShowPopupAction->isChecked())winPopup->slideTranslationFor( itm );
 
                   QEventLoop loop2;
                   QTimer::singleShot(cfg.preferences.slideShowTimer, &loop2, SLOT(quit()));
                   loop2.exec();
               }
               file.close();
           }
Тормоза не обнаружены. 100,000 реальных слайдов заводятся мгновенно. Какой вариант предпочтительней? Учитывая, что список вполне может быть и на 200,000 и на 300,000.
« Последнее редактирование: Июль 19, 2013, 20:36 от Spark » Записан
Spark
Гость
« Ответ #29 : Июль 19, 2013, 20:26 »

Осталось решить маленький баг. Если ставить таймер показа большим (допустим час), а после ставить маленький (допустим 5 сек), то придется ждать час. Причина ясна. Как избавиться, не прерывая последовательность обработки спика? Или все таки придется пересмотреть механизм показа слайд?
Так полагаю таймер можно зациклить с коротким дискретным значением. Но как от этого пострадает точность? И грамотная ли это реализация? Может прервать цикл можно иным более правильным способом?
« Последнее редактирование: Июль 19, 2013, 21:18 от Spark » Записан
Страниц: 1 [2] 3 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.53 секунд. Запросов: 22.