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 записывает базу данных на диск. А в связи с тем что таких запросов несколько тысяч то и записывает он множество раз.

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

Спасибо заранее за помощь ! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
molchanoviv
  опции профиля:
сообщение 29.6.2010, 20:16
Сообщение #2


Старейший участник
****

Группа: Сомодератор
Сообщений: 597
Регистрация: 18.7.2008
Из: Саратов
Пользователь №: 238

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




Репутация:   5  


Ты всю табличку разом в виджет выгружаешь? На мой взгляд лучше использовать LIMIT, а при пролистывании таблицы прото заново выполнять запрос. Я думаю так будет быстрее. Хотя я могу и ошибаться ибо не пробовал.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
JuryS1806
  опции профиля:
сообщение 29.6.2010, 20:25
Сообщение #3


Студент
*

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

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




Репутация:   0  


Цитата(molchanoviv @ 29.6.2010, 21:16) *
Ты всю табличку разом в виджет выгружаешь? На мой взгляд лучше использовать LIMIT, а при пролистывании таблицы прото заново выполнять запрос. Я думаю так будет быстрее. Хотя я могу и ошибаться ибо не пробовал.


Я вообще еще до конца так и не понял насчет процессов и потоков. Сейчас как-то пальцем в небо. Формирую таблицу, затем делаю qApp()->processEvents, затем ее отображаю, плюс в ней напичкал виджетов - кнопок, цветных форм, ролей с подсказками, но тормозит не из-за этого всего.

Просто при ресайсе и отображении. При перелистывании, даже звук дергается в колонках. На каком-то форуме давно встречал, что парень отключил какую-то примочку и она залетала. Что-то типа resize - eventa. Только где это не пойму.

Цитата(panter_dsd @ 29.6.2010, 7:23) *
Еще используй prepare и bindValue. Это тоже ускорит запросы.

Спасибо за совет, только я вот не пойму, как выполняются SQL-запросы. В драйвер передаются эти самые bindValue или они преобразуются опять-же в QString.
Это мне лень просто Qt-исходники ковырять, думаю как бы не получилось за зря лишних движений. Сейчас очень быстро работает. Даже не замечаю как, 700 кБ формирует за 0.3 сек под макросом.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- 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


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


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




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