Toon posts:

[C++] ADO performance problemen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben op het moment bezig met mijn eerste C++ programma. Ik probeer een progje te maken dat een aantal tabellen van een SQL Server naar een Access database exporteerd (vraag niet waarom :+ ). De code die ik tot nu toe heb werkt wel, maar het probleem is dat mijn hele GUI vertraagt, CPU-usage is 99%, Mem-usage is zo'n 150MB en het exporteren duurt behoorlijk lang. Volgens mij is dit niet echt normaal.

Ik moet hier wel bij vertellen dat het om tabellen gaat die tot 70.000 records bevatten, maar dit moet toch wel kunnen :?

Mijn kopieer-loop ziet er als volgt uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
        for(int i = 0; i < 34; i++)
        {
            fromRecordset.CreateInstance (__uuidof (Recordset));
            fromRecordset->CursorLocation = adUseClient;
            fromRecordset->PutCacheSize(100);
            fromRecordset->Open(tables[i],_variant_t((IDispatch *)fromConn,true),adOpenForwardOnly,adLockReadOnly,adCmdTable);

            numRecords = fromRecordset->Fields->Count;

            while(!(fromRecordset->EndOfFile))
            {
                CString table = tables[i];
                CString query = "INSERT INTO "+table+" VALUES (";
                for(columnCount = 0; columnCount < numRecords; columnCount++)
                {
                    vtVal = fromRecordset->Fields->Item[(long)columnCount]->Value;
                    CString strVal = VarianttToStr(vtVal);
                    if(columnCount+1 >= numRecords)
                        query = query+strVal;
                    else
                        query = query+strVal+",";
                }
                fromRecordset->MoveNext();
                query = query+");";
                toConn->Execute(query.AllocSysString(),NULL,adExecuteNoRecords);
            }
            m_cProgress.SetPos(5+3*(i-3));
            fromRecordset->Close();
        }

tables[] is een array van strings waarin mijn tabelnamen zijn opgeslagen. De variabele toConn is een verbinding met mijn Access database, fromConn is een verbinding met de SQL Server.

Een ding wat ik zeker weet is dat het aan mijn Access database ligt als ik namelijk
code:
1
toConn->Execute(query.AllocSysString(),NULL,adExecuteNoRecords);

uit mijn code verwijder, dan loopt het programma stukken sneller. Het ligt dus niet aan mijn SQL Server.

Ik heb al een aantal verschillende dingen geprobeerd om de code te verbeteren. Zo heb ik bijvoorbeeld voor de Access database ook een Recordset aangemaakt die via de methode AddNew nieuwe records toevoegd, en de nieuwe records uiteindelijk via batch-updates naar Access schrijft. Maar dat helpt ook niet, de performance werd zelfs nog slechter :X

Iemand enig idee :?

Verwijderd

je gui loopt vast omdat je in dezelfde thread je cpu intensieve export doet, om je gui niet te vertragen moet je je export functie in een andere thread laten draaien. Dus moet je de oplossing in multithreaded programmeren zoeken.

[ Voor 4% gewijzigd door Verwijderd op 30-03-2005 17:10 . Reden: typo ]


Verwijderd

Topicstarter
Verwijderd schreef op woensdag 30 maart 2005 @ 17:10:
je gui loopt vast omdat je in dezelfde thread je cpu intensieve export doet, om je gui niet te vertragen moet je je export functie in een andere thread laten draaien. Dus moet je de oplossing in multithreaded programmeren zoeken.
Dan ga ik straks maar eens met threads spelen. Dan is het GUI-probleem in ieder geval al opgelost :)

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Ik denk zelfs dat je meerdere threads tegelijk kunt gebruiken; die 34 tabellen lijken onafhankelijk. Die zou je per tabel in een eigen thread kunnen laten lopen. Het voordeel daarvan is dat je door kunt gaan met het klaarzetten van een query terwijl access een andere query uitvoert. Een andere optie is adAsyncExecute.
(let wel op je progress bar, de updates daarvan worden subtiel)

Eeb andere verbetering zou het gebruik van parameterized queries kunnen zijn. Bouw een keer een
INSERT INTO table[i] VALUES(?,?,?) op en voeg vervolgens per row de parameters toe. Een goede DB kan daar effectief mee omgaan, en een matige lost in elk geval je quote probleem op.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
MSalters schreef op woensdag 30 maart 2005 @ 17:43:
Ik denk zelfs dat je meerdere threads tegelijk kunt gebruiken; die 34 tabellen lijken onafhankelijk. Die zou je per tabel in een eigen thread kunnen laten lopen. Het voordeel daarvan is dat je door kunt gaan met het klaarzetten van een query terwijl access een andere query uitvoert. Een andere optie is adAsyncExecute.
(let wel op je progress bar, de updates daarvan worden subtiel)
Ik heb het inmiddels voor elkaar gekregen om aparte threads te starten, en ik moet zeggen dat alles nu een stuk soepeler verloopt. Maar de hoge CPU/Mem-usage blijven uiteraard. Ik heb ook adAsyncExecute geprobeerd, maar ik krijg een foutmelding dat asynchrone uitvoering niet wordt ondersteund.
Eeb andere verbetering zou het gebruik van parameterized queries kunnen zijn. Bouw een keer een
INSERT INTO table[i] VALUES(?,?,?) op en voeg vervolgens per row de parameters toe. Een goede DB kan daar effectief mee omgaan, en een matige lost in elk geval je quote probleem op.
Heb ik een quote probleem, dan?

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 23:16
Zitten er datum of string velden in je table?

Kijk trouwens ook ff of je nog SysFreeString() moet callen.

[ Voor 15% gewijzigd door farlane op 01-04-2005 14:37 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Verwijderd schreef op vrijdag 01 april 2005 @ 14:26:
[...]
Heb ik een quote probleem, dan?
Wat gebeurt er als je source database een text veld bevat, en de inhoud van dat tekstveld bevat zelf
quotes?

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
MSalters schreef op vrijdag 01 april 2005 @ 14:54:
[...]

Wat gebeurt er als je source database een text veld bevat, en de inhoud van dat tekstveld bevat zelf
quotes?
De VarianttToStr-functie lost dat op met:
code:
1
val.Replace("'", "\''");

Maar het probleem is ook niet dat mijn programma niet werkt, het programma gebruikt gewoon te veel resources.

[ Voor 7% gewijzigd door Verwijderd op 01-04-2005 19:39 ]

Pagina: 1