Russian Qt Forum

Qt => Базы данных => Тема начата: developer от Январь 22, 2008, 20:18



Название: QSqlTableModel with QSqlQuery
Отправлено: developer от Январь 22, 2008, 20:18
Здравствуйте, скажите пожалуйста, з чем  лучше работать: з qsqltablemodel или qsqlquery, если стоит вопрос економии памяти. Например, есть tableWidget, его можно заполнить с помощью qsqltablemodel:
//==========================
model->setTable("operacii");
model->setFilter("Npr_id = 5 and CurDate > '2002.01.01'");
model->select();
tableWidget->setColumnCount(model->columnCount());
tableWidget->setRowCount(model->rowCount());
for(int row = 0; row < model->rowCount() ; row++)
   for(int col = 0; col < model->columnCount(); col++)
      tableWidget->setItem(row, col, new QTableWidgetItem(model->data(model->index(row,col)).toString()));
//=============================
Или с помощью qsqlquery:
//=========================
QSqlQuery query("select * from some_table");
QSqlQuery rowCount("select count(*) from some_table");
rowCount.seek(0);
tableWidget->setColumnCount(query.count());
tableWidget->setRowCount(rowCount.value(0).toInt());
while(query.next())
{
    tableWidget->setItem(row,col, new QTableWidget(query.value().toString()));
}
//здесь неполный код,но ето неважно.
//=========================
Теперь вопрос к всем кто может помочь:
Где используеться меньше памяти в первом или втором варианте. Профайлером или подобными программами не пользуюсь.



Название: Re: QSqlTableModel with QSqlQuery
Отправлено: ритт от Январь 22, 2008, 21:12
qsqlquery жрёт меньше
правда, если ты на таких объёмах собрался экономить, лучше вообще отказаться от кутей


Название: Re: QSqlTableModel with QSqlQuery
Отправлено: Alex03 от Январь 23, 2008, 08:09
Код:
while(query.next())
{
    tableWidget->setItem(row,col, new QTableWidget(query.value().toString()));
}
надо читать как
Код:
while(query.next())
{
    tableWidget->setItem(row,col, new QTableWidgetItem(query.value().toString()));
}
?

Если Вы удаляете модель после заполнения tableWidget, то остаётся только tableWidget с кучей QTableWidgetItem-ов внутри (подозреваю что ещё и в своей внутренней модели). Т.е. оба способа одинаковы по расходу памяти после удаления модели.

А вот если бы вы в первом случае пользовали QTableView (передав ему свою QSqlTableModel) вместо QTableWidget то скорее всего по памяти съэкономили бы.


Название: Re: QSqlTableModel with QSqlQuery
Отправлено: ритт от Январь 23, 2008, 12:41
я говорил непосредственно о qsqlquery :)
если нужно сэкономить память, то лучше использовать QTableView вместо QTableWidget
если _необходимо_ экономить память, то вместо использования qsqltablemodel можно отнаследоваться от абстрактной модели, при построении делать два квери (описания столбцов + примари кей) и при отображении данных каждый раз выбирать нужные по примари кей и отображаемым столбцам (без кеширования) - в таком случае производительность заметно упадёт, например, плавной прокрутки вьюхи не получится

мне кажется, игра не стоит свеч


Название: Re: QSqlTableModel with QSqlQuery
Отправлено: _govorilka от Январь 23, 2008, 14:18
Я тоже думаю, что игра не стоит свеч. В данном примере лучше думать не о количестве памяти, а об скорости работы программы. Если думать об оптимизации, то я взял QTableView + модельку  унаследованную от QAbstractItemModel, написанную как обвертку над C API какого-либо SQL-сервера (например MySQL или PostgreySQL).


Название: Re: QSqlTableModel with QSqlQuery
Отправлено: ритт от Январь 23, 2008, 14:50
говорилка, было бы интересно взглянуть...
если не жалко, кинь на форум или в личку

з.ы. если жалко, забаню :)


Название: Re: QSqlTableModel with QSqlQuery
Отправлено: Tonal от Январь 23, 2008, 19:47
У нас работает именно так, как _govorilka описал.
Правда из на python. :)