Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt] Проблема с открытием большого HTML файла


Автор: mosg 16.11.2008, 13:22
Добрый день!

Проблема в следующем: есть html-файл с размером 6Mb, структура которого представляет из себя записи в виде (ссылка|пояснение) и т.д. на 50 тыс. строк ...

Так вот не могу открыть этот документ в QTextDocument или QTextEdit! :( Точнее сказать - прога подвисает на целую эпоху, что не допустимо, и требуется время хотя бы 10-15 секунда на открытие этого документа. Понимаю что многое зависит от железа и загрузки машины, но дельфевые варианты открываются на этой же машине с тем же железом за доступные 10-15 секунд.

Как вариант рассматриваю дополнение html-строк в виджет, но как реализовать пока не представляю.

Пробую вот так: 
Код
    if (!QFile::exists(f))
        return;
    QFile file(f);
    if (!file.open(QFile::ReadOnly))
        return;

    QByteArray data = file.readAll();
    QTextCodec *codec = Qt::codecForHtml(data);
    QString str = codec->toUnicode(data);
    if (Qt::mightBeRichText(str)) {
        textBrowser->setHtml(str);
    } else {
        str = QString::fromLocal8Bit(data);
        textBrowser->setPlainText(str);
    }


Может быть кто сталкивался с такой проблемой?

Заранее спасибо за советы!

Автор: SABROG 16.11.2008, 13:59
Попробуй метод setMaximumBlockCount(). Не уверен, что поможет и, возможно, где-то в другом месте начнет притормаживать, но тролли советуют использовать его для отображения логов, которые обычно бывают довольно большими. Сам не пробывал, поэтому не знаю будет ли возможен скроллинг. Как воторой и третий вариант можно посмотреть в сторону QTextBrowser и QWebKit, если не требуется редактирование.

И скорее всего бесполезные советы:
- setUpdatesEnabled(false);
         bigVisualChanges();
  setUpdatesEnabled(true);

-  QTextCursor::beginEditBlock();
   //вставка текста
   QTextCursor::endEditBlock();
  

Автор: mosg 16.11.2008, 14:45
Цитата(SABROG @  16.11.2008,  13:59 Найти цитируемый пост)
QWebKit

Да, начал крутить с этим модулем, но результаты пока не оченб внушительные, вместо 10-12 секунд, код: 
Код
webView = new QWebView;
QUrl url(guessUrlFromString(fileName));
webView->load(url);

Крепко подвисает на ~ 1 минуту 45 секунд, т.е. работает в 7! раз медленнее :( Хотя конечно надо ещё покопаться и найти информацию по оптимизации вызова webView->load(), т.к. в демо-примерах "Demonstration"|"Browser" тот же файл грузится около 30 секунд, что немного радует.

Да и варианты setUpdatesEnabled и подобных тут точно не канают.

Все равно спасибо за советы. Если найду максимально быстрый путь загрузки, код кину сюда обязательно.

Автор: SABROG 16.11.2008, 15:06
Вот еще что подумал. Дебаг версия обычно медленнее чем Релиз. Какую тестируешь ?
Попробуй подключить код профайлера, если используешь gcc. Надо будет добавить это:

в .pro файл
Код

CONFIG(debug, debug|release) { 
    CONFIG += console
    DEFINES += debug__
    QMAKE_CXXFLAGS_DEBUG += -pg
    QMAKE_LFLAGS_DEBUG += -pg 
}


Потом запускаешь дебаг версию и ждешь, когда медленный участок кода отработает до конца. Выходишь из программы и ищешь новый файлик gmon.out. Подсовываешь его профайлеру:

Код

gprof program.exe gmon.out >> profiling.txt


И получаешь нечто похожее:

Код

             Call graph (explanation follows)


granularity: each sample hit covers 4 byte(s) for 0.06% of 15.81 seconds

index % time    self  children    called     name
                                                 <spontaneous>
[1]     99.4    3.72   11.99                 main [1]
                1.70    3.20 90000000/90000000     QList<unsigned int>::operator[](int) [2]
                0.77    3.26 90000000/90000000     QList<unsigned int>::operator<<(unsigned int const&) [3]
                0.91    2.01 90000000/90000000     QList<unsigned int>::at(int) const [5]
                0.00    0.11       1/1           TForm::TForm() [12]
                0.02    0.00       2/2           QList<unsigned int>::size() const [17]
                0.00    0.00       3/776         QLatin1String::QLatin1String(char const*) [28]
                0.00    0.00      17/2914        QString::~QString() [72]
                0.00    0.00       6/131         QString::QString() [97]
                0.00    0.00       3/775         QString::QString(QLatin1String const&) [86]
                0.00    0.00       2/61          QString::QString(char const*) [105]
                0.00    0.00       2/2           QDir::current() [402]
                0.00    0.00       2/872         operator new(unsigned int) [83]
                0.00    0.00       2/50          operator+(QString const&, QString const&) [110]
                0.00    0.00       1/2           QList<unsigned int>::QList() [413]
                0.00    0.00       1/97          operator+(QString const&, char const*) [101]
                0.00    0.00       1/2           operator|(QIODevice::OpenModeFlag, QIODevice::OpenModeFlag) [430]
                0.00    0.00       1/2           QWidget::show() [421]
                0.00    0.00       1/1           TForm::~TForm() [504]
                0.00    0.00       1/2           QList<unsigned int>::~QList() 


Т.е. тут видно, что дольше всего выполняется цикл из 90 миллионов итерация, на втором месте - конструктор главной формы.

Если узнаем где узкое место, то возможно сможем обойти его.

Автор: mosg 16.11.2008, 16:31
Цитата(SABROG @  16.11.2008,  15:06 Найти цитируемый пост)
Попробуй подключить код профайлера

Завтра попробую на работе.

Да, я забыл совсем сказать, использую в основном debug. Результаты конечно будут отличаться, но мне почему-то никогда в голову не приходило, что дебаг версия будет в 2.5 раза медленее ...

Автор: JackYF 19.11.2008, 15:50
Цитата(mosg @  16.11.2008,  15:31 Найти цитируемый пост)
что дебаг версия будет в 2.5 раза медленее ... 

Дебаг-версия может быть на порядок/полтора медленнее иногда, так что smile

Автор: ldir 30.4.2013, 09:33
Здравствуйте! Кто нибудь нашел решение? У меня та же проблема. Если кто знает способ побороть, хоть скажите куда глядеть.

Автор: Jeka178RUS 30.4.2013, 12:25
Для больших объемов данных сразу напрашивается поток (хотя как помню с гуями есть сложности) или читать по несколько строк, а потом вызывать processEvents руками, тем самым оживляя окно и обновляя progresBar с состоянием загрузки данных. Еще посмотри что тут пишут http://stackoverflow.com/questions/1386043/how-to-make-qt-work-when-main-thread-is-busy

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)