VCL-Speicher Verwaltung
-
Eine SQL-Abfrage liefert mir eine Datenmenge mit ca. 45000 Zeilen.
Diese Daten werden als Textdatei gespeichert. Platzbedarf ungefähr 3.5 MB
jetzt wird diese abfrage von meinem prog ausgeführt und Daten in einer StringGrid angezeigt.
Speichernutzung des Programms nach dem Start: ca. 9 MB
Nach der Abfrage fast 60 MB also 50 MB nur für die 3 MB Daten. :o :o :oSpeicherfresser .NET braucht vergleichsweise "nur" 20 MB
-
Könnte es sein das irgendwo eine Schleife oder derartiges is und die dann irgendwelchen Speicher nich wieder freigibt?
-
Danke für die Information. Oder hattest du auch eine Frage?
-
Hallo,
läuft das Programm im "Debugger" oder als EXE ohne Debug-Bibliothek ausserhalb der IDE ?
Gruß Mikel
-
als EXE ohne Debug-Bibliothek ausserhalb der IDE
In Debug-Modus bricht das Prog bei ca. 650 MB mit Speicherüberlauf zusammen
-
... dann würde ich mich mal fragen ob du nicht vielleicht irgendwo einen Anwendungsfehler der VCL gemacht hast ...
-junix
-
... dann würde ich mich mal fragen ob du nicht vielleicht irgendwo einen Anwendungsfehler der VCL gemacht hast ...
was soll denn der Quatsch?
int c = 1; while (!ADOQuery1->Eof) { StringGrid1->Cells[0][c] = String(c); StringGrid1->Cells[1][c] = ADOQuery1->FieldByName("kunden_nr")->AsString; StringGrid1->Cells[2][c] = ADOQuery1->FieldByName("BELEG_NR")->AsString; StringGrid1->Cells[3][c] = ADOQuery1->FieldByName("ARTIKEL_NR")->AsString; StringGrid1->Cells[4][c] = ADOQuery1->FieldByName("TEXT")->AsString; gm += ADOQuery1->FieldByName("MENGE")->AsFloat; StringGrid1->Cells[5][c] = FormatFloat("#,##0.00", ADOQuery1->FieldByName("MENGE")->AsFloat) + " " + ADOQuery1->FieldByName("MENGENEINH")->AsString; StringGrid1->Cells[6][c] = ADOQuery1->FieldByName("BDAT")->AsString; gw += ADOQuery1->FieldByName("WERT")->AsFloat; StringGrid1->Cells[7][c] = FormatFloat("#,##0.00", ADOQuery1->FieldByName("WERT")->AsFloat); ADOQuery1->Next(); c++; }
-
Hallo
Ich hatte anfangs bei einer meiner DB Anwendungen StringGrids genutzt, bis mich ein Kollege darauf hinwies, dass StringGrids langsam sind. Er bot mir eine Lösung mit einem auf einem Panel gesetzten THeader und einem TList, sowie eine andere Lösung, mit der DBGrid Komponente (Diese, so musste ich feststellen, arbeitet sehr schnell, allerdings kommt es auf die DB an, wie einfach man sich zeilennummern anzeigen lassen kann)
-
Das StringGrid langsam ist kann ich so nicht bestätigen:
ich hatte mal so'n test gemacht:
aus einer db 100000 datensätze mit 7 felder abragen und in StringGrid schreiben: 2 Sekunden Zeit
test 2
aus der db 100000 datensätze mit 7 felder abragen ohne in StringGrid zu schreiben: 2 Sekunden Zeit
Also in bereich von Millisekunden.
und bei DBGrid: ist das alles ganz anders: DBGrid zeigt zu einem Zeitpunkt nur ein Bruchteil der möglichen Daten, nur das was auf dem Bildschirm zu sehen ist und einbischen mehr. scrollt man nach unten/oben, werden die fehlenden daten vom server abgefragt.
geht man zu ende des DBGrids dann dauert das uach ganz schön lange, da alle Datensätze vom server übertragen werden müssen.
-
Hmm.. OK, wenn bei dir der Test so ausgefallen ist, dann liegt es nicht daran.
Ich hatte es ebenfalls getestet, und der StringGrid war um ein vielfaches langsamer als das Listenfeld. So war/ist meine Erfahrung