Ситуация:
Есть бинарный лог. Я его читаю по записям и засовываю в таблицу.
Засовываю в неё только 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();