Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Fehler "Zu wenig Arbeitsspeicher" beim Füllen der Datenbank (https://www.delphipraxis.net/194009-fehler-zu-wenig-arbeitsspeicher-beim-fuellen-der-datenbank.html)

Uwe Raabe 7. Okt 2017 12:40

AW: Fehler "Zu wenig Arbeitsspeicher" beim Füllen der Datenbank
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1382786)
Bei MS Access gabs über ADO die Option Serverseitige Curser zu verwenden damit bei einer TTable-Komponenten nicht der komplette Tabelleninhalt von der Access-Engine nochmal in die Delphi-Teil der Anwendung kopiert wurde. Evtl. gibt das auch bei Interbase.

Da es sich um den Embedded-Server handelt (eine DLL), spielt sich das Ganze im Adressraum der Anwendung ab. Da ist es vollkommen egal, ob der Server die Datenbank in den Speicher lädt, denn der Server ist in diesem Fall die Anwendung selbst.

nahpets 7. Okt 2017 12:45

AW: Fehler "Zu wenig Arbeitsspeicher" beim Füllen der Datenbank
 
Ja, aber könnte es dann nicht so sein, dass sowohl die DLL, als auch die DataSet-Komponente die gesamten Daten separat im Speicher vorhalten?

Damit hätte doch dann die Anwendung die Daten zweimal im Speicher?

Oder ein anderer Ansatz:

Statt mit 'nem DataSet und Append, 'ne Query nehmen. Das könnte dann sinngemäß ungefähr (ungetestet) so aussehen:
Delphi-Quellcode:
  AssignFile(F, 'C:\daten.txt');
  reset(F);
  form1.Query1.SQL.Clear;
  form1.Query1.SQL.Add('EXECUTE BLOCK BEGIN');
  repeat
    begin
      readln(F, temp);
      x := x + 1;
      form1.Query1.SQL.Add(Format('insert into tabellenname (Name) Values (%s);',[QuotedStr(temp)]));
      // Jeweils 1000 Namen "am Stück" in die Tabelle einfügen.
      // Statt 1000 ggfls. einen angepassten größeren oder kleineren Wert nehmen.
      if x Mod 1000 do begin
        form1.Query1.SQL.Add('END');
        form1.Query1.ExecSQL;
        form1.Query1.SQL.Clear;
        form1.Query1.SQL.Add('EXECUTE BLOCK BEGIN');
      end;
    end
  until eof(F);
  if form1.Query1.SQL.Count > 1 then begin
    form1.Query1.SQL.Add('END');
    form1.Query1.ExecSQL;
    form1.Query1.SQL.Clear;
  end;
  CloseFile(f);

  showmessage('...fertig. ' + inttostr(x) + ' Datensätze');

bnreimer42 7. Okt 2017 13:19

AW: Fehler "Zu wenig Arbeitsspeicher" beim Füllen der Datenbank
 
Schönes Beispiel, aber ein Fehler ist da drinnen:

Delphi-Quellcode:
form1.Query1.SQL.Add(Format('insert into tabellenname (Name) Values (%s);',[QuotedStr(temp)]));
Da kann mit einem falschen String in der Textdatei Blödsinn passieren.

Besser mit Parametern arbeiten:

Delphi-Quellcode:
form1.Query1.SQL.Add('insert into tabellenname (Name) Values (:ParamX);');
form1.Query1.Params[x]:=temp;
x musst Du halt als Zahl hochzählen.

(Auch ungetestet)

Bernhard Geyer 7. Okt 2017 14:10

AW: Fehler "Zu wenig Arbeitsspeicher" beim Füllen der Datenbank
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1382801)
Da es sich um den Embedded-Server handelt (eine DLL), spielt sich das Ganze im Adressraum der Anwendung ab. Da ist es vollkommen egal, ob der Server die Datenbank in den Speicher lädt, denn der Server ist in diesem Fall die Anwendung selbst.

Nein, ist es nicht. Auf Server-DLL-Seite kann die DB-Engine noch Optimierungen durchführen um nicht wirklich alles Daten im Speicher halten zu müssen. Werden diese Daten dann komplett im Client-Dataset auf Delphi-Seite der Exe gehalten, ist das nicht mehr möglich.

p80286 7. Okt 2017 19:59

AW: Fehler "Zu wenig Arbeitsspeicher" beim Füllen der Datenbank
 
Da ich bisher noch nicht so intensive Bekanntschaft mit embedded Servern hatte, ich meine mich zu erinnern, daß da lokal einige Services laufen, darum bin ich davon ausgegangen, das das Client-Programm zwar auf der selben Maschine aber ansonsten unabhängig von der DB läuft? (z.B. InterbaseServer)

Gruß
K-H

mkinzler 7. Okt 2017 20:09

AW: Fehler "Zu wenig Arbeitsspeicher" beim Füllen der Datenbank
 
Embedded bedeutet, dass die Client-Dll den Serverkern enthält. Keine externen Services usw.

p80286 7. Okt 2017 21:22

AW: Fehler "Zu wenig Arbeitsspeicher" beim Füllen der Datenbank
 
Ok, Danke!

Gruß
K-H

hstreicher 8. Okt 2017 08:57

AW: Fehler "Zu wenig Arbeitsspeicher" beim Füllen der Datenbank
 
Wie ist den die Firebird Datenbank Konfiguriert
- Pagesize
- Buffers DefaultDbCachePages
- werden UDF verwendet
- Forcedwrites
- MaxUnflushedWrites
wo liegt ggf da Temp Verzeichniss und wieviel Platz ist da frei


Pagesize*Buffers ist die Anzahl Bytes die Firebird im Cache vorhält (bei embeded)

Speicherverbrauch bei offenen Transactionen
http://www.firebirdfaq.org/faq118/



mfg Hannes


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:28 Uhr.
Seite 3 von 3     123   

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