Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi StringGrid Begrenzung bei ca. 1 Mio Zeilen ? (https://www.delphipraxis.net/123916-stringgrid-begrenzung-bei-ca-1-mio-zeilen.html)

nobby 11. Nov 2008 06:58


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:
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;
Besten Dank für jegliche Hinweise,
Nobby

mkinzler 11. Nov 2008 07:00

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

nobby 11. Nov 2008 07:03

Re: StringGrid Begrenzung bei ca. 1 Mio Zeilen ?
 
Was gibe es denn für Alternativen?

taaktaak 11. Nov 2008 07:13

Re: StringGrid Begrenzung bei ca. 1 Mio Zeilen ?
 
Moin, Moin.
Datenhaltung in separater Liste, Grid nur für die Darstellung der (sichtbaren) Daten verwenden.

Bernhard Geyer 11. Nov 2008 07:14

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 TreeView zu verwenden.

nobby 11. Nov 2008 07:27

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.

taaktaak 11. Nov 2008 07:34

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!

DeddyH 11. Nov 2008 07:37

Re: StringGrid Begrenzung bei ca. 1 Mio Zeilen ?
 
Ich würde TStringGrid überhaupt nicht verwenden :mrgreen:

taaktaak 11. Nov 2008 07:53

Re: StringGrid Begrenzung bei ca. 1 Mio Zeilen ?
 
Oooch Detlef, diese wunderschöne Komponente,
das ist jetzt aber gemein von dir :roll:

QuickAndDirty 11. Nov 2008 08:36

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 14:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz