crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> QSqlQuery и работа с большим кол-вом данных, тормоза записи
JuryS1806
  опции профиля:
сообщение 28.6.2010, 23:34
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 93
Регистрация: 21.10.2009
Из: Нижний Новгород
Пользователь №: 1168

Спасибо сказали: 9 раз(а)




Репутация:   0  


Доброго времени суток!

Имею следующий код при работе с SQLITE:

void writedb::writeMyLibraryMaterials(const QString myFileName, const QMap<int,QStringList> LibraryMaterials,
                                      const QMap<int,QString> LibraryCategory)
{
QSqlDatabase db = QSqlDatabase::database("myLibraryMaterialConnect",false);
db.setDatabaseName(myFileName);
if (!db.open())
    {
        QMessageBox::warning(0, trUtf8("Ошибка"), trUtf8("Ошибка при подключении к базе данных %1.").arg(myFileName));
        return;
    }

QSqlQuery query(db);
     query.exec("DELETE FROM LibraryMaterials;");
     query.exec("DELETE FROM LibraryCategory;");
QString strF;
QString str;
QStringList current;
QString arg[13];
QMap<int,QStringList>::const_iterator it=LibraryMaterials.begin();
while (it != LibraryMaterials.end())
{
    current = it.value();
    for (int i = 0; i < current.size(); ++i)
        arg[i]=current.at(i);

strF = "INSERT INTO LibraryMaterials ("
              "number, category, name, colorreg, colorgreen, colorblue, material,"
              "text1, text2, scalex, scaley, repeatex, repeatey, autorepeat) "
              "VALUES('%1', '%2', '%3', '%4', '%5', '%6', '%7', '%8', '%9', '%10', '%11', '%12', '%13', '%14');";
str = strF.arg(it.key())        //номер материала
          .arg(arg[0].toInt())  //номер категории
          .arg(arg[1])          //имя материала
          .arg(arg[2].toInt())  //R
          .arg(arg[3].toInt())  //G
          .arg(arg[4].toInt())  //B
          .arg(arg[5].toInt())  //номер базового материала
          .arg(arg[6])          //файл текстуры 1
          .arg(arg[7])          //файл текстуры 2
          .arg(arg[8].toDouble())
          .arg(arg[9].toDouble())
          .arg(arg[10].toDouble())
          .arg(arg[11].toDouble())
          .arg(arg[12].toInt());

if (!query.exec(str))
    QMessageBox::warning(0, trUtf8("Ошибка"), trUtf8("Не смогли записать данные в таблицу библиотечных материалов."));
++it;
}

QMap<int,QString>::const_iterator itCat=LibraryCategory.begin();
while (itCat != LibraryCategory.end())
{

strF = "INSERT INTO LibraryCategory ("
              "number, name) "
              "VALUES('%1', '%2');";

str = strF.arg(itCat.key()).arg(itCat.value());

if (!query.exec(str))
    QMessageBox::warning(0, trUtf8("Ошибка"), trUtf8("Не смогли записать категории материалов."));
++itCat;
}

if (db.isOpen())  db.close();
}


Все работает, все здорово, но только после выполнения пары тысяч строк, происходит бурная работа на жестком диске.

Т.е. насколько я понимаю, при выполнении любого SQL запроса, qt записывает базу данных на диск. А в связи с тем что таких запросов несколько тысяч то и записывает он множество раз.

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

Спасибо заранее за помощь ! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Алексей1153
  опции профиля:
сообщение 30.6.2010, 6:26
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(JuryS1806 @ 29.6.2010, 23:09) *
Единственный минус, тормоза при использовании QTableWidget медленно перелистывает, все окна плавают, как будто он грузит машину. Где-то раньше читал, что его ускоряют при отключении каких-то примечек.... Но не могу ничего пока придумать


Я в таких случаях делал таблицу на экране всего в несколько десятков строк (точнее - ровно столько, сколько видно на экране). Это такое окно для огромной "мысленной" таблицы.
Затем, имеется переменная: хранит, какая строка из "мысленной" таблицы должна быть вверху окна.
Также, имеется кеш (обновляемый по времени) гда хранятся считанные из базы строки. При обновлении кеша производится удаление давно не используемых данных.
Детали мог сейчас не все вспомнить, но суть такая :)

А для возможности обратной связи в одно из полей таблицы (по возможности невидимое) нужно печатать уникальный ключ из базы

Сообщение отредактировал Алексей1153 - 30.6.2010, 6:29
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- JuryS1806   QSqlQuery и работа с большим кол-вом данных   28.6.2010, 23:34
- - JuryS1806   Разобрался ! Может кому пригодится: Перед соз...   29.6.2010, 0:09
- - Алексей1153   Ну, по хорошему, так обычно и делается - крупные и...   29.6.2010, 6:23
- - panter_dsd   Еще используй prepare и bindValue. Это тоже ускори...   29.6.2010, 6:23
|- - JuryS1806   Вообще, приятно удивлен скоростью работы с базой д...   29.6.2010, 20:09
- - molchanoviv   Ты всю табличку разом в виджет выгружаешь? На мой ...   29.6.2010, 20:16
|- - JuryS1806   Цитата(molchanoviv @ 29.6.2010, 21:16) Ты...   29.6.2010, 20:25
- - Litkevich Yuriy   если СУБД поддерживает подстановку (binding), то с...   29.6.2010, 21:10
|- - JuryS1806   Цитата(Litkevich Yuriy @ 29.6.2010, 22:10...   29.6.2010, 23:05
- - Алексей1153   Цитата(JuryS1806 @ 29.6.2010, 23:09) Един...   30.6.2010, 6:26
- - Litkevich Yuriy   Цитата(JuryS1806 @ 30.6.2010, 3:05) Почем...   30.6.2010, 10:33
- - panter_dsd   Выкинь QTableWidget и используй связку QSqlTableMo...   30.6.2010, 11:29
- - Litkevich Yuriy   Цитата(panter_dsd @ 30.6.2010, 15:29) Вык...   30.6.2010, 13:02
- - JuryS1806   Цитата(Litkevich Yuriy @ 30.6.2010, 14:02...   30.6.2010, 19:41


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 2.12.2024, 13:30