AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Firebird Import aus Textdatei extrem langsam
Thema durchsuchen
Ansicht
Themen-Optionen

Firebird Import aus Textdatei extrem langsam

Ein Thema von globetrotter77 · begonnen am 13. Sep 2009 · letzter Beitrag vom 18. Sep 2009
Antwort Antwort
Seite 6 von 7   « Erste     456 7      
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#51

Re: Firebird Import aus Textdatei extrem langsam

  Alt 16. Sep 2009, 13:30
Zitat:
Keine prepared Queries weil das Ganze nur einmal läuft.
Aber wohl mehrere Datensätze, oder?
Markus Kinzler
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#52

Re: Firebird Import aus Textdatei extrem langsam

  Alt 16. Sep 2009, 15:02
Halo,

also ich gehe ohne SQL-Monitor nicht aus dem Haus.

Ausserdem:
Wenn es eine einmalige Sache ist, sch** auf die Zeit


Heiko
Heiko
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#53

Re: Firebird Import aus Textdatei extrem langsam

  Alt 16. Sep 2009, 21:18
So ich habe mich jetzt nochmal dran versucht.

Zitat von globetrotter77:
Zitat von omata:
So, ich habe das jetzt mal selber ausprobiert...
Code:
1.000.000   Zeilen = 0:18 (Datei = 16MB)
1.000.000.0 Zeilen = 2:48 (Datei = 166MB)
da komme ich noch lange nicht ran ...
Ich muss meine Aussage leider etwas korrigieren...

Zitat von globetrotter77:
Ca. 105000 Datensätze in knapp 4 Minuten
Ich schaffe immerhin 1000000 Datensätze (Datenvolumen von 60MB) in 4 Minuten (siehe Anhang).

Die Zeiten die ich oben angegeben hatte, hatte ich mit FlameRobin ausprobiert und eben nicht in Delphi. Das sollte eigentlich auch kein Problem darstellen, allerdings darf für meinen Vorschlag die Option "ExternalFileAccess" nicht auf None stehen. Dies ist die Voreinstellung und kann über die firebird.conf geändert bzw. überschrieben werden. Mit FlameRobin funktioniert das auch, aber eben leider nicht, wenn man selber aus Delphi heraus auf Firebird (Emmbedded) zugreift (vielleicht kann mir ja einer verraten wie das geht).
Deshalb konnte ich leider nicht meinen ersten Vorschlag umsetzen.


Zitat von globetrotter77:
hast du auch doppelte Primary Keys dabei?
die muss ich nämlich berücksichtigen
Nein, diesen Sonderfall habe ich jetzt noch nicht betrachtet.
Angehängte Dateien
Dateityp: zip firebird_179.zip (2,67 MB, 12x aufgerufen)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#54

Re: Firebird Import aus Textdatei extrem langsam

  Alt 17. Sep 2009, 04:10
Hallo,

Also

Delphi-Quellcode:
SQLDataSet.ExecSQL;
Application.ProcessMessages;
du rufst nach jedem Insert Application.ProcessMessages; auf.

Ich würde das ändern in

Delphi-Quellcode:
if (FZeile mod 100) then
begin
  Application.ProcessMessages;
end;
Da du ja hier eh einen Zähler (Fzeile) hast,
könnte man auch den Tip mit Commit/StartTransaction einbauen


Delphi-Quellcode:
if (FZeile mod 100) then
begin
  SQLConnection.Commit(TD);
  SQLConnection.StartTransaction(TD);
end;
Zusammen also wie folgt:

Delphi-Quellcode:
if (FZeile mod 100) then
begin
  Application.ProcessMessages;
end;

if (FZeile mod 100) then
begin
  SQLConnection.Commit(TD);
  SQLConnection.StartTransaction(TD);
end;
Ich würde es so wie hier getrennt lassen,
dann kann man am mod X noch rumspielen.


Zitat:
Firebird (Emmbedded)
Dazu muss einfach die FBClient.DLL ausgetauscht werden,
das Programm sollte im Idealfall davon gar nix mitbekommen.

Exe -> FBClient(SQL-Server) -> SQL-Server
Exe -> FBClient(Embedded)

Die embedded-Variante der FBClient-Dll implementiert den SQL-Server
selber und reicht die Befehle nicht weiter wie die normale DLL.

Zusätzlich müssen noch ein paar Dateien in ein Unterverzeichnis,
Infos dazu hier (Suche) oder einfach mal Frau Google fragen.


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
680 Beiträge
 
FreePascal / Lazarus
 
#55

Re: Firebird Import aus Textdatei extrem langsam

  Alt 17. Sep 2009, 09:19
und wenn du deinen import noch mal richtig beschleunigen willst, dann bau in deinem Delphi Programm deine Textdatei auf ein fixedformat um (also pro spalte eine feste anzahl an zeichen, nicht genutzte mit Leerzeichen auffüllen). Danach schaust du dir die Deaklaration eines external files in Firebird an (geht in IBExpert mit einem assisetnten im Table editor, wichtig: in der Firebird conf vorher ein directory für external files freigeben.

im sql editor geht das auch direkt

create table imp external file 'C:\imp.txt'
(ID CHAR(18),
TXT1 CHAR(80),
TXT2 CHAR(80),
TXT3 CHAR(80),
CRLF CHAR(2))

usw, dann kannst du mit "insert into tabx select * from imp" extrem schnell daten importieren, je nach hardware durchaus bis 100.000 records pro sekunde!

alternativ ab fb2 einfach dein SQL mit

execute block
as
insert .....;
insert .....;
insert .....;
.....
insert .....;
insert .....;
end

aufbauen, damit gehen mehrere Inserts pro sql

aber immer wichtig: aktive Transaktionssteuerung
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
IBExpert and Firebird Power Workshops jederzeit auch als Firmenschulung
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#56

Re: Firebird Import aus Textdatei extrem langsam

  Alt 17. Sep 2009, 12:46
Zitat von hoika:
du rufst nach jedem Insert Application.ProcessMessages; auf.

Ich würde das ändern
Das hatte ich getestet und das brachte keine zeitliche Verbesserung.

Zitat von hoika:
Da du ja hier eh einen Zähler (Fzeile) hast,
könnte man auch den Tip mit Commit/StartTransaction einbauen
Hast du das mal ausprobiert, ich könnte mir vorstellen, dass das gar nichts bringt.

Zitat von hoika:
Dazu muss einfach die FBClient.DLL ausgetauscht werden,
das Programm sollte im Idealfall davon gar nix mitbekommen.

Die embedded-Variante der FBClient-Dll implementiert den SQL-Server
selber und reicht die Befehle nicht weiter wie die normale DLL.
Hast du mal in mein Archiv geschaut, da sind alle möglichen, benötigten DLLs drin. Ich hatte auch geschrieben, dass ich das mit FlameRobin ausprobiert hatte, die selbe DLL und auch im Embedded-Modus.

Zitat von hoika:
Zusätzlich müssen noch ein paar Dateien in ein Unterverzeichnis,
Infos dazu hier (Suche) oder einfach mal Frau Google fragen.
Ja wunderbar, selbst wird man mal konkret und erhält nur nicht getestete "womöglich Vorschläge".

Zitat von IBExpert:
und wenn du deinen import noch mal richtig beschleunigen willst, dann bau in deinem Delphi Programm deine Textdatei auf ein fixedformat um (also pro spalte eine feste anzahl an zeichen, nicht genutzte mit Leerzeichen auffüllen). Danach schaust du dir die Deaklaration eines external files in Firebird an (geht in IBExpert mit einem assisetnten im Table editor, wichtig: in der Firebird conf vorher ein directory für external files freigeben.
Genau das war meine erste beschriebene Idee, die (wie ebenfalls geschrieben) mit FlameRobin zu den oben erwähnten Zeiten kommt, aber eben leider nicht aus Delphi heraus funktioniert.

Was soll das? Habt ihr auch mal gelesen, was ich geschrieben habe? Habt ihr auch mal eure Vorschläge ausprobiert? Ich versuche hier zu helfen, in diesem Fall mal wieder mit einem konkreten Beispiel, wie wäre mit konkreten Vorschlagen/Erweiterungen/Verbesserungen und eigenen Tests.

Wenn man das so ließt, meint ihr wohl, ich bin da der totale Volldepp. (Eben nicht! ich bin der, der es ausprobiert hat!)

Und da ihr ja alle so schlau seit, werde ich jetzt nichts mehr zum Thema sagen.
  Mit Zitat antworten Zitat
Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
680 Beiträge
 
FreePascal / Lazarus
 
#57

Re: Firebird Import aus Textdatei extrem langsam

  Alt 17. Sep 2009, 13:42
warum sollte ein create table mit external file aus delphi heraus nicht funktionieren? das mach ich andauernd.
Das external file sollte immer eine temporäre tabelle sein, die dann z.B. via "update or insert" oder stored
proc in die reale tabelle übertragen wird.

Ich will keineswegs deine Postings kritisieren und das man den einen oder anderen Eintrag 4 seiten vorher
mal übersieht ist ja auch möglich oder? Von volldeppen spricht hier keiner, ich jedenfalls nicht.
nicht jeder Input aus diesem Forum hat den Anspruch 100% sauberen kompilierbaren code zu liefern, weil nicht
jeder die zeit dazu hat, das für jede Anfrage umzusetzen. Wenn du das zu jedem deiner Postings machst finde ich
das sehr lobenswert.

das nur dazu, und meinen Hinweis auf execute block ist auch problemlos innerhalb von Delphi benutzbar, jedenfalls
mit brauchbaren aktuellen Zugriffskomponenten.
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
IBExpert and Firebird Power Workshops jederzeit auch als Firmenschulung
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#58

Re: Firebird Import aus Textdatei extrem langsam

  Alt 17. Sep 2009, 13:54
Zitat:
warum sollte ein create table mit external file aus delphi heraus nicht funktionieren?
IBExpert ist ja wohl auch in Delphi erstellt worden.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
680 Beiträge
 
FreePascal / Lazarus
 
#59

Re: Firebird Import aus Textdatei extrem langsam

  Alt 17. Sep 2009, 14:17
Zitat von mkinzler:
Zitat:
warum sollte ein create table mit external file aus delphi heraus nicht funktionieren?
IBExpert ist ja wohl auch in Delphi erstellt worden.
sehr guter Hinweis, danke, warum bin ich denn da nicht drauf gekommen
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
IBExpert and Firebird Power Workshops jederzeit auch als Firmenschulung
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#60

Re: Firebird Import aus Textdatei extrem langsam

  Alt 17. Sep 2009, 14:43
Zitat von omata:
... Das sollte eigentlich auch kein Problem darstellen, allerdings darf für meinen Vorschlag die Option "ExternalFileAccess" nicht auf None stehen. Dies ist die Voreinstellung und kann über die firebird.conf geändert bzw. überschrieben werden. Mit FlameRobin funktioniert das auch, aber eben leider nicht, wenn man selber aus Delphi heraus auf Firebird (Emmbedded) zugreift (vielleicht kann mir ja einer verraten wie das geht).
Wer lesen kann ist klar im Vorteil...

Zusatz: Zugriff über DBExpress (so wie der TE auf die DB zugreift)

Darauf wird natürlich mit keiner einzigen Silbe mal eingegangen, echt bedauerlich.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 6 von 7   « Erste     456 7      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:55 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