QSqlQueryModel Speicher wird nicht freigegeben

Alles rund um die Programmierung mit Qt
Antworten
lunatic fringe
Beiträge: 4
Registriert: 4. Februar 2010 18:57

QSqlQueryModel Speicher wird nicht freigegeben

Beitrag 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.
Arocz
Beiträge: 18
Registriert: 3. Februar 2010 09:06
Wohnort: Edermünde Besse

Beitrag von Arocz »

Code: Alles auswählen

model->setQuery("SELECT * FROM songs"); 
wie groß ist denn die Tabelle Songs?
lunatic fringe
Beiträge: 4
Registriert: 4. Februar 2010 18:57

Beitrag 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.
Arocz
Beiträge: 18
Registriert: 3. Februar 2010 09:06
Wohnort: Edermünde Besse

Beitrag 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]
lunatic fringe
Beiträge: 4
Registriert: 4. Februar 2010 18:57

Beitrag von lunatic fringe »

Da du das model nicht anzeigst
Ich verwende das QSqlQueryModel oder
meinst Du, wie die Tabelle aussieht?
Arocz
Beiträge: 18
Registriert: 3. Februar 2010 09:06
Wohnort: Edermünde Besse

Beitrag 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)?
lunatic fringe
Beiträge: 4
Registriert: 4. Februar 2010 18:57

Beitrag 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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wenn Du eh schon einen Testcase hast würde ich mal schauen was valgrind dazu sagt.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten