Seite 1 von 1

QSqlQueryModel Speicher wird nicht freigegeben

Verfasst: 4. Februar 2010 23:48
von lunatic fringe
Hallo,

bei folgendem Code wird immer mehr Speicher belegt. Das führt bei großen Abfragen dazu, daß sogar bis zu 10 Mb nicht mehr freigegeben werden.

Code: Alles auswählen

    
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(dbname);
    if(db.Open())
    {
        QSqlQueryModel* model = new QSqlQueryModel();
        model->setQuery("SELECT * FROM songs");
        while(model->canFetchMore())
            model->fetchMore();
        delete model;
        db.Close()
    }

Gibt es eine Abhilfe ?

Gruß
l.f.

Verfasst: 5. Februar 2010 08:29
von Arocz

Code: Alles auswählen

model->setQuery("SELECT * FROM songs"); 
wie groß ist denn die Tabelle Songs?

Verfasst: 5. Februar 2010 09:52
von lunatic fringe
ca 50000 Einträge, die Datenbankdatei hat ca 110 Mb und belegt im Speicher ca 180 Mb.
Wenn ich den Code mehrmals durchlaufe bleiben zwischen 3 - 10 Mb im Speicher zusätzlich belegt.
Ein

Code: Alles auswählen

model->clear()
vor dem delete hilft auch nicht.

Verfasst: 5. Februar 2010 10:14
von Arocz
Da du das model nicht anzeigst(zumindest nciht in deinem Codebeispiel), würde ich mal versuchen nicht alle Datensätze zu laden...

Code: Alles auswählen

  while(model->canFetchMore())
            model->fetchMore(); 
Du solltest dir da überlegen ob es nötig ist dir alle Datensätze zu holen.
Wenn du diese nicht unbedingt brauchst, solltest du mal probieren die while Schleife rauszunehmen...[/code]

Verfasst: 5. Februar 2010 10:22
von lunatic fringe
Da du das model nicht anzeigst
Ich verwende das QSqlQueryModel oder
meinst Du, wie die Tabelle aussieht?

Verfasst: 5. Februar 2010 10:44
von Arocz
Naja das Model ist ja nur das Modell, um es anzuzeigen brauchst du noch einen View, du verstehst(mit view->setModel(model); ).

die fetchMore() Schleife holt sich die ganze Tabelle in den Speicher, du solltest da überdenken ob das wirklich nötig ist! Ich schätze mal dass du dadurch deinen Speicher volllaufen lässt.

Wie oft führst denn diesen code in deinem Programm aus? und in welchen Zusammenhang(ich frage mich ob du die Datenbank immer wieder neu erstellst)?

Verfasst: 5. Februar 2010 12:26
von lunatic fringe
Angezeigt wird es in einem QTableView.
Aber das Problem tritt auch auf ohne das ich das QSqlQueryModel keinem View zuordne.

Eigentlich passiert so eine Abfrage selten, ist aber halt nicht ausgeschlossen.
Außerdem summiert sich der Speicherbedarf nach einiger Zeit dann doch beträchtlich, selbst wenn die Ergebnisse nicht groß sind.
Warum ich das so mache?
Die Datenbank wird mit einer Vielzahl an unterschiedlichen SQL Abfragen durchsucht und soll nur so lange geöffnet sein wie unbedingt notwendig.

Verfasst: 5. Februar 2010 12:47
von Christian81
Wenn Du eh schon einen Testcase hast würde ich mal schauen was valgrind dazu sagt.