![]() |
Datenbank: PostgreSQL • Version: 8.3 • Zugriff über: Zeos
Speicherverbrauch Zeoslib auf Postgres
Hallo zusammen,
ich teste den Zugriff über Zeos auf Postgres. Dabei habe ich bei einer ganz einfachen Anwendung (ZConnection, ZQuery, Datasource, DBGrid) festgestellt das der Speicherverbrauch ungewöhnlich hoch ist. Bei einer Tabelle mit 7000 Datensätze (3,5MB) hat die Testanwendung einen Speicherverbrauch von 234MB nach dem Daten laden! Wenn ich bei der ZQuery-Komponente die Eigenschaft ReadOnly=false setze braucht die Anwendung nach dem Daten laden 5MB, was ich bei einer Tabellengröße von 3,5MB absolut in Ordnung finde. Bin für jede Hilfe oder Tipp sehr dankbar. Starsky |
Re: Speicherverbrauch Zeoslib auf Postgres
Wie gehabt : ohne Quelltext keine Hilfsmöglichkeit !
|
Re: Speicherverbrauch Zeoslib auf Postgres
Delphi-Quellcode:
Hallo Hansa,
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, ZAbstractRODataset, ZAbstractDataset, ZDataset, ZConnection, Grids, DBGrids, ZAbstractTable; type TForm1 = class(TForm) DBGrid1: TDBGrid; ZConnection1: TZConnection; DataSource1: TDataSource; ZQuery1: TZQuery; private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} end. wie oben schon beschrieben, eine ganz einfache Anwendung. Es ist alles nur zusammengeklickt und dann mit dem Taskmanager beobachtet mit den beschriebenen Speicherverhalten. Einmal mit der Einstellung ZQuery1.Readonly:=false // 234MB einmal mit ZQuery1.Readonly:=true // 5MB Starsky |
Re: Speicherverbrauch Zeoslib auf Postgres
Wie sieht den die Abfrage aus?
Läuft der Server lokal oder remote? |
Re: Speicherverbrauch Zeoslib auf Postgres
Delphi-Quellcode:
Die Datenbank läuft lokal.
object Form1: TForm1
Left = 0 Top = 0 Caption = 'Form1' ClientHeight = 236 ClientWidth = 383 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object DBGrid1: TDBGrid Left = 0 Top = 0 Width = 383 Height = 236 Align = alClient DataSource = DataSource1 TabOrder = 0 TitleFont.Charset = DEFAULT_CHARSET TitleFont.Color = clWindowText TitleFont.Height = -11 TitleFont.Name = 'Tahoma' TitleFont.Style = [] end object ZConnection1: TZConnection Protocol = 'postgresql-8' HostName = 'localhost' Database = 'testdb' User = 'postgres' Password = 'postgres' Connected = True DesignConnection = True Left = 16 Top = 48 end object DataSource1: TDataSource DataSet = ZQuery1 Left = 16 Top = 144 end object ZQuery1: TZQuery Connection = ZConnection1 Active = True ReadOnly = True SQL.Strings = ( 'select * from kunde') Params = <> Left = 16 Top = 96 end end Dieses verhalten ist aber auch mit allen anderen Tabellen festzustellen. Die Testtabelle hat keine übergroßen Felder (keine BLOBS oder TEXT Felder) Starsky |
Re: Speicherverbrauch Zeoslib auf Postgres
Soweit ich das bei mir Beobachten konnte,
ist dieser Speicherverbrauch normal. Steigt aber bei komplexeren Abfragen nicht wesentlich an. // Grüße Martin |
Re: Speicherverbrauch Zeoslib auf Postgres
Wenn ich die Zeos Komponenten
durch ADO (AdoConnection, AdoDataset) über OLE-ODBC teste braucht die Anwendung auch nur 5MB um die Kundentabelle zu laden. Ich habe das mit einer noch größeren Tabelle (72000 Datensätze) getestet. Da schmiert mir die komplette IDE ab nachdem der Speicherverbrauch auf über 2GB angewachsen war. Ich nutze die Zeos Version 6.6.2-RC. Gibt es da vielleicht irgendein Patch von dem ich nicht weiß? Starsky |
Re: Speicherverbrauch Zeoslib auf Postgres
Hallo,
kompilier das doch mal mit fastmm4 oder memcheck. Heiko |
Re: Speicherverbrauch Zeoslib auf Postgres
Ich habe festgestellt das der hohe Speicherverbrauch
durch die Verbindung vom Datasource zum DBGrid ensteht. Wenn ich die Zuordnung vom Datasource zum DBGrid entferne, ist der Speicherverbrauch normal. Wenn ich die Verbindung wieder herstelle steigt der Speicherverbrauch um das 50-fache. Liegt das jetzt an der Zeos-Komponente? Starsky |
Re: Speicherverbrauch Zeoslib auf Postgres
Zitat:
|
Re: Speicherverbrauch Zeoslib auf Postgres
Ich hatte das Problem auch schonmal. Ich behaupte, es liegt an Deiner Abfrage:
SQL-Code:
Damit werden alle Datensätze aus der DB in den Speicher(Records der TZQuery-Komponente) geladen. Setz' mal ein LIMIT 35000 an die Abfrage dran. Dein Speicherverbrauch dürfte sich dann halbieren.
SELECT * FROM kunde;
|
Re: Speicherverbrauch Zeoslib auf Postgres
Wie kommst du überhaupt auf die 2 GB ? :shock: Wirklich 2 GB oder etwa 2 MB ? :mrgreen: Vom Taskmanager oder woher stammt diese Zahl ?
|
Re: Speicherverbrauch Zeoslib auf Postgres
Hallo zusammen
@BloodySmartie die Vermutung hatte ich auch und hatte es mit Feldangaben im SELECT-Statement getestet. Hat aber auch nichts gebracht. Mit dem LIMIT ist mir auch klar aber das Problem ist das es nicht sein kann, dass die Abfrage im Speicher über 50 x größer ist als die gesamte Tabellengröße. Wie oben beschrieben, wenn ich den ZQuery auf Readonly=true oder die Verbindung zum DBGrid löse, verhält sich die Zeos-Query Komponente ja ganz normal. @Hansa beim Daten laden beobachte ich den Taskmanager wie der durch die Decke geht. Wenn die Delphi-IDE über 2GB geht, verabschiedet sich die komplette IDE. Ich habe es auch alleine mit der erstellten Anwendung probiert, verhält sich genau so. Starsky |
Re: Speicherverbrauch Zeoslib auf Postgres
Bei Dir stimmt aber wohl nix. Was treibst du da ? :mrgreen: Ich habe folgendes getestet :
Delphi-Quellcode:
Die TABLEX hat ca. 250.000 DS mit Volumen von insgesamt 30 MB. Ich habe das mal in eines meiner relativ wichtigen Programme eingebaut. Speicher beim Start : 5,8 MB. Wird das SQL-Statement abgesetzt, so steigt der auf 24 MB. Wird die entsprechende Form geschlossen, dann sind es wieder 6,4 MB. Das sind realistische Werte. Bevor hier einer unnötig überlegt : die 30 MB kommen von der Größe einer importierten Tabelle. Die in der DB tatsächlich vorhandene (weil veränderte) hat wohl 15-20 MB, das passt. 2 GB sind IMHO völlig unrealistisch. Wie hast Du das fertiggebracht ? :shock: Interessant ist auch das Zeitverhalten. Die leere Showmessgae kommt sofort. DS für DS da durchzuwandern dauert eben. Ohne daurnde Windows Bildschirm-Aktualisierung, also Memo.Hide << 1 Min, ansonsten 3-4 Min. 8). Basis dabei ist allerdings FIBPlus.
AusgabeDS.Close;
AusgabeDS.SelectSQL.Text := 'SELECT * FROM TABLEX'; AusgabeDS.Open; ShowMessage(''); memo2.Hide; while not AusgabeDS.Eof do begin memo2.Lines.Add(AusgabeDS.Fieldbyname ('ID').AsString); AusgabeDS.Next; end; memo2.Show; Aaaaahh, sehe gerade Postgre. Dann eben außer Zeos auch noch das noch. Tut sich da noch was ? Es sird merkwürdig ruhig drum. :gruebel: |
Re: Speicherverbrauch Zeoslib auf Postgres
@Hansa: Di vergleichst mal wieder Äpfel mit Birnen. Das Verhalten einer Anwendung die per FIBplus auf FireBird zugreift, kann sich durchaus von der per Zeos auf PosGres zugreifenden unterscheiden. Obwohl das DBMS hier wohl egal ist, da es nicht lokal läuft.
|
Re: Speicherverbrauch Zeoslib auf Postgres
Hallo,
welche ZEOS-Version ? Ich denke, es ist ein Bug in ZEOS. Ich würde mir mal die allerneuste Version mal laden (Forum-Suche). Dass ein DBGrid mehr Speicher verbrät sollte klar sein (das zugrundeliegende DataSet muss bidirectional sein). 1. Probier mal ZQuery.Filtered := True; Habe ich über Google gefunden 2. TClientDataSet Packe die Daten aus der Query dort rein und benutze dass mal als DBGrid-DataSet. Nur mal so zum Test. Gibt es nicht auch nen ZEOS-Forum ( ![]() Heiko |
Re: Speicherverbrauch Zeoslib auf Postgres
Hallo zusammen,
@Heiko Ich benutze die Zeos-Version 6.6.2-rc Eine neuere gibt meines Wissens nicht. Ich hatte schon überlegt es mit der vorherigen Version 6.6.1-Beta zu probieren. Aber das mit dem ClientDataset ist eine gute Idee, dass werde ich heute Abend sofort testen. Hat denn schon irgendjemand die Zeos-Komponente Version 6.6.2-rc mit den PostgreSQL erfolgreich am laufen? Starsky |
Re: Speicherverbrauch Zeoslib auf Postgres
Hallo,
und denk an das ZQuery.Filtered := True; Auch wenn (und gerade wenn) du keinen Filter benutzt (so stand es in google). Heiko |
Re: Speicherverbrauch Zeoslib auf Postgres
Hallo Heiko
auch den ZQuery.Filtered:=True werde ich testen. Danke für die Tipps. Starsky |
Re: Speicherverbrauch Zeoslib auf Postgres
Hallo zusammen,
@Heiko: Volltreffer, mit dem Filtered:=true hat geholfen. Könntest Du mir deinen Google-Link zukommen lassen wo Du deine Info her hast? Bei mir spuckt Goggle zu dem Thema nichts aus! Wenn ich den ZQuery mit gesetzten Filter (ohne Filterdefinition) auf Active:=true setze ist der Speicherverbrauch absolut in Ordnung. Wenn ich dann ZQuery.Filtered:=false setze geht der Speicher von vorher 4MB auf 234MB (mit meiner 7000 Datensätze Tabelle) Naja, so habe ich erstmal eine Lösung um mit der Zeoslib zu testen aber das richtige Vertrauen habe ich so in der Komponente nicht. Erstmal vielen Dank an Heiko und allen anderen :thumb: Starsky |
Re: Speicherverbrauch Zeoslib auf Postgres
Hallo,
der Link. ![]() das 2. Posting. Ursache ist das RecordCount, was von ZEOS "suboptiomal" umgesetzt wird, um mal freundlich zu bleiben ;) Statt nem Select Count(*) wird halt lokal gefiltert. Warum dabei der Speicher so verbraten wird, ist noch eine andere Frage. Heiko |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:31 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-2025 by Thomas Breitkreuz