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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QT4. Таблицы и занимаемая ими память.  (Прочитано 4375 раз)
Deiv
Гость
« : Август 11, 2005, 07:01 »

Ситуация:
Есть бинарный лог. Я его читаю по записям и засовываю в таблицу.
Засовываю в неё только 4 поля из структуры лога.
Дата-время, IP-строка, IP-строка, Траффик-байты.
При количестве записей = 100 000, программа занимает в памяти 78 метров. При этом логи могут быть раз в 10 больше, мне это внушает опасение (т.к. памяти на моей машиневсего 512 :-), это лирика).
Может я что не так делаю?
Как уменьшить объем занимаемой памяти?
Плюс, ещё интересно, файл грузится долго. Когда я просто на чистых сях конвертил лог в текстовый, программа это делала мухой, но естественно там никаких виджетов не было. Никак нельзя ускорится?
Все это делпется следующим кодом.
Код:

    Form *viewTable = new Form;
    viewTable->ui.tableWidget->setColumnCount( numCols );
    viewTable->ui.tableWidget->setRowCount( countRows+1 );
    QStringList fieldList;
    fieldList   << QString::fromLocal8Bit( "Время" )
                << QString::fromLocal8Bit( "Исходящий адрес" )
                << QString::fromLocal8Bit( "Входящий адрес" )
                << QString::fromLocal8Bit( "Байты" ) ;
    viewTable->ui.tableWidget->setHorizontalHeaderLabels(fieldList);
    viewTable->ui.tableWidget->horizontalHeader()->setResizeMode(0, QHeaderView::Stretch);
    long summ=0;
    QString text;
    QDateTime time;
    QTableWidgetItem *item;
    for ( i = 0; i < countRows; ++i )
    {
        if (load_fl == 0) {
            i=-1;
            break;
        }
        if (fileop.read( (char *) &ntf, size_struct ) <=0)
        {
            QMessageBox::critical( 0, QString::fromLocal8Bit("Ошибка"), QString::fromLocal8Bit("Ошибка при чтении следующего блока."), 0, 0, 0 );
            i--;
            break;
        }
        else {
            time.setTime_t(ntf.time);
            text = time.toString();
            item = viewTable->ui.tableWidget->item(i, 0);
            if (!item) {viewTable->ui.tableWidget->setItem(i, 0, new QTableWidgetItem(text));}
            else {viewTable->ui.tableWidget->item(i, 0)->setData(Qt::EditRole, text);}
           text = inet_ntoa(ntf.saddr);
            item = viewTable->ui.tableWidget->item(i, 1);
            if (!item) {viewTable->ui.tableWidget->setItem(i, 1, new QTableWidgetItem(text));}
            else {viewTable->ui.tableWidget->item(i, 1)->setData(Qt::EditRole, text);}

            text = inet_ntoa(ntf.daddr);
            item = viewTable->ui.tableWidget->item(i, 2);
            if (!item) {viewTable->ui.tableWidget->setItem(i, 2, new QTableWidgetItem(text));}
            else {viewTable->ui.tableWidget->item(i, 2)->setData(Qt::EditRole, text);}

            text = QString::number(ntf.bytes);
            item = viewTable->ui.tableWidget->item(i, 3);
            if (!item) {viewTable->ui.tableWidget->setItem(i, 3, new QTableWidgetItem(text));}
            else {viewTable->ui.tableWidget->item(i, 3)->setData(Qt::EditRole, text);}

            summ += ntf.bytes;
            ui.progressBar->setValue( i );
            if (fmod(i,200)==0) {qApp->processEvents();}
        }
    }

    fileop.close();
Записан
ElderOrb
Гость
« Ответ #1 : Август 11, 2005, 11:37 »

Имхо в данной ситуации можно попробовать вместо QTableWidget использовать QTableView, почитав предварительно в Qt Assistant-е раздел Model/View programming. Должно работать быстрее чем QTableWidget, и меньше жрать памяти.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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