![]() |
StringGrid Begrenzung bei ca. 1 Mio Zeilen ?
Hallo
Ich versuche ein StringGrid mit Daten zu füllen. Ab einer bestimmten Anzahl Zeilen bekomme ich eine EAccessViolation. Die Begrenzung scheint bei ca. 1 Mio. rows zu liegen (1024 * 1024). Hat jemand eine Ahnung, ob man diese Begrenzung umgehen kann? Ich habe ca. 4 Mio. Datensätze zum laden.
Code:
Besten Dank für jegliche Hinweise,
procedure TForm2.Button1Click(Sender: TObject);
const ROW_LIM = 1024 * 1024; var i: Integer; begin StringGrid1.RowCount := ROW_LIM + StringGrid1.FixedRows; Label1.Caption := 'Row count: ' + IntToStr(StringGrid1.RowCount); Application.ProcessMessages; try for i := StringGrid1.FixedRows to ROW_LIM do StringGrid1.Cells[0, i] := IntToStr(i); except on E: Exception do Label1.Caption := E.Message + ' at row ' + IntToStr(i); end; end; Nobby |
Re: StringGrid Begrenzung bei ca. 1 Mio Zeilen ?
Ich würde mir eher Gedanken machen, ob es sinnvoll ist 4Mio Datensätze in ein Grid zu laden
|
Re: StringGrid Begrenzung bei ca. 1 Mio Zeilen ?
Was gibe es denn für Alternativen?
|
Re: StringGrid Begrenzung bei ca. 1 Mio Zeilen ?
Moin, Moin.
Datenhaltung in separater Liste, Grid nur für die Darstellung der (sichtbaren) Daten verwenden. |
Re: StringGrid Begrenzung bei ca. 1 Mio Zeilen ?
Ich kann nur mkinzler zustimmen. 1 Mio. Datensätze wird sich niemand anschauen.
Zu deinem Problem. Falls du eine ältere Delphi-Version hast würde ich mal FastMM einbinden, da der alte MemoryManager gerne unter Speicherfragmentierung leitet (Falls es nicht die 2GB-Grenze von 32-Bit-Prozessen erreicht wird). Ansonsten gibt es die möglichkeit mittels virtuellen Modus z.B. TListView zu nehmen (Virtual Listview-Beispiel von Delphi) oder TElTreeView (Elpack) oder Virtual ![]() |
Re: StringGrid Begrenzung bei ca. 1 Mio Zeilen ?
Natürlich schaut sich keiner ALLE Datensätze an, aber der Benutzer sollte gewisse Datenbereiche (Zeit von...bis) einsehen können und dann markieren und weiterverarbeiten. Die Daten stammen von eine Accessdatei (.mdb). Mit Access sehe ich die Daten in ein paar Sekunden und kann sehr schnell in die Mitte oder zum Ende scrollen. Das kann ich mit einem DBGrid auch, also denke ich kaum, dass ich in welche Hardwarebegrenzungen laufe. Wenn ich madExcept einschalte, kann ich den Fehler in der Unit Grids.pas in der function MakeAt lokalisieren. Dort wird ein TSparsePointerArray verwendet, welches so definiert ist: PointerArray = array [0..512*1024*1024 - 2] of Pointer; Scheint mir so, als ob dort die Begrenzung herkommt.
|
Re: StringGrid Begrenzung bei ca. 1 Mio Zeilen ?
Ist es nicht egal, wo die Begrenzung liegt?
Ich würde schon ab wenigen hundert Datensätzen das StrinGrid nicht mehr für die Datenhaltung verwenden! |
Re: StringGrid Begrenzung bei ca. 1 Mio Zeilen ?
Ich würde TStringGrid überhaupt nicht verwenden :mrgreen:
|
Re: StringGrid Begrenzung bei ca. 1 Mio Zeilen ?
Oooch Detlef, diese wunderschöne Komponente,
das ist jetzt aber gemein von dir :roll: |
Re: StringGrid Begrenzung bei ca. 1 Mio Zeilen ?
Das Stringgrid der VCL von D7 verwendet in den TStringGridstrings soweit ich weiß einen auf
Geschwindigkeit ausgelegten Hack um Speicher zu allokieren. Konkret verwndet es Anstelle von Getmem was ja Heapspeicher bereitstellt und evtl. von Windows anfordert, Speicher aus dem Stacksegment der Anwendung. Daher würde ich auf so aktionenen wie einige Mio Datensätze ins Gitter zu laden verzichten und nur das laden was gerade Sichtbar sein soll.... Evtl mal über die Verwendung einer Datenbank nachdenken. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz