AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Dataset schnell! in eine Datei speichern?
Thema durchsuchen
Ansicht
Themen-Optionen

Dataset schnell! in eine Datei speichern?

Ein Thema von hitzi · begonnen am 24. Feb 2005 · letzter Beitrag vom 24. Feb 2005
Antwort Antwort
Benutzerbild von hitzi
hitzi

Registriert seit: 2. Jan 2003
Ort: Eibau
768 Beiträge
 
Delphi 2010 Professional
 
#1

Dataset schnell! in eine Datei speichern?

  Alt 24. Feb 2005, 08:53
Datenbank: Informix • Zugriff über: ADO
Hallo,

ich muss eine Abfrage in eine Datei speichern. Zur Zeit gehe ich wie folgt vor:

Delphi-Quellcode:
 [...]
      if dbDataSet.Active then dbDataSet.Close;
      dbDataSet.CommandText := GetSQLFile(SQL);
      Screen.Cursor := crSQLWait;
      try
        dbDataSet.Open;
      finally
        Screen.Cursor := crDefault;
      end;

      Table.Clear; //TStringlist
      GetFieldConfig(dbDataSet.FieldCount, ExtractFileName(SQL));

      Output('Daten des SQL "' + ExtractFileName(SQL) + '" werden gespeichert.');
      Screen.Cursor := crHourGlass;
      try
        while not dbDataSet.Eof do begin
          Row.Clear; //TStringlist
          for i := 0 to dbDataSet.FieldCount - 1 do begin
            s := trim(dbDataSet.Fields[i].AsString);
            if Option(cOptionGetWeekByDate, i) then s := GetWeek(dbDataSet.Fields[GetWantedField(cOptionGetWeekByDate + '(', ')', i)].AsDateTime);

            if fFieldLength[i] > -1 then begin
              if fFieldLength[i] < Length(s) then s := copy(s, 1, fFieldLength[i]);
              if fFieldLength[i] > Length(s) then begin
                if Option(cOptionFillLengthLeft, i) then
                  s := FillString(s, fFieldLength[i], false)
                else if Option(cOptionFillLengthRight, i) then
                  s := FillString(s, fFieldLength[i], true);
              end;
            end;
            Row.Add(s);
          end;
          Row.Delimiter := ';'; //damit's eine csv kompatible Datei wird
          Table.Add(Row.DelimitedText);
          dbDataSet.Next;
        end;

        Table.SaveToFile(OutputFile); //TStringlist speichern - dadurch wird eine csv kompatible Datei erstellt
      finally
        Screen.Cursor := crDefault;
      end;
[...]
Bei 12.000 Datensätzen dauert das speichern der Daten so etwa 5-8 Sekunden. Bei einer Abfrage mit einer Ergebnismenge von rund 500.000 Datensätzen dauert es aber rund 75 Minuten. Hochgerechnet von der Zeit der 12.000 Datensätze sollte, dass doch eigentlich nur 5-6 Minuten dauern.

Wie kann ich diese Routine beschleunigen?

Gruss
Thomas
Besucht doch mal http://www.hitziger.net
  Mit Zitat antworten Zitat
opfer.der.genauigkeit

Registriert seit: 14. Feb 2005
66 Beiträge
 
#2

Re: Dataset schnell! in eine Datei speichern?

  Alt 24. Feb 2005, 09:12
Hi,

Ich würde dir empfehlen immer Schrittweise in die Datei zu schreiben,
z.B. immer 500 DS aufeinmal oder so.
Stellen Sie sich bitte Zirkusmusik vor.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#3

Re: Dataset schnell! in eine Datei speichern?

  Alt 24. Feb 2005, 09:20
Hallo,
ich würde mal in der Dokumentation des Informix OLEDbProviders nachschauen,
ob ähnliche Funktionalitäten wie sie die Jet-Engine hat unterstützt werden. Da es sich beim
csv-Format quasi um ein Standartformat handelt könnte es gut möglich sein.
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Dataset schnell! in eine Datei speichern?

  Alt 24. Feb 2005, 09:32
Zitat von hitzi:
Bei 12.000 Datensätzen dauert das speichern der Daten so etwa 5-8 Sekunden. Bei einer Abfrage mit einer Ergebnismenge von rund 500.000 Datensätzen dauert es aber rund 75 Minuten. Hochgerechnet von der Zeit der 12.000 Datensätze sollte, dass doch eigentlich nur 5-6 Minuten dauern.
Hast Du schon mal kontrolliert ob Windows anfangen muss zu swappen?
Für solche Aktionen solltest Du auch einen Forward-Only-Curser nehmen. Dort wird der Speicher bei den schon abgearbeiteten Datensätzen sofort wieder freigegeben. Ebenfalls kannst Du speicher sparen indem Du statt der Stringlist z.B. mittels Writeln einfach die Datensätze rausschreibst, ohne sie alle weiter im Speicher zu halten.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von hitzi
hitzi

Registriert seit: 2. Jan 2003
Ort: Eibau
768 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Dataset schnell! in eine Datei speichern?

  Alt 24. Feb 2005, 09:49
Theoretisch sollte der noch nicht swappen. Beim Speichern in die Stringlist nimmt die Anwendung die volle Prozessorlast und hat einen Speicherverbrauch von etwa 20 MB, dieser steigt allerdings noch weiteran (aber sehr langsam - nach 25min waren es etwa 50MB).

Ich probier mal die von Jens angesprochene Möglichkeit (http://www.entwickler-forum.de/webx?...ci.8@.2cb7d27c) durch, da ich alternativ auch Accessdateien nutzen kann. Obwohl ... sind die nicht auf 65000 Datensätze beschränkt?
Thomas
Besucht doch mal http://www.hitziger.net
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Dataset schnell! in eine Datei speichern?

  Alt 24. Feb 2005, 10:49
Zitat von hitzi:
Ich probier mal die von Jens angesprochene Möglichkeit (http://www.entwickler-forum.de/webx?...ci.8@.2cb7d27c) durch, da ich alternativ auch Accessdateien nutzen kann. Obwohl ... sind die nicht auf 65000 Datensätze beschränkt?
Excel ist beschränkt, nicht Access. Excel kann nur maximal 65000 Zeilen beinhalten
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von hitzi
hitzi

Registriert seit: 2. Jan 2003
Ort: Eibau
768 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Dataset schnell! in eine Datei speichern?

  Alt 24. Feb 2005, 11:02
Danke für deinen Hinweis Bernhard. Ich hatte das mit dem Pocket Access verwechselt. Pocket Access ist auf diese Anzahl von Datensätzen beschränkt.

Gruss
Thomas
Besucht doch mal http://www.hitziger.net
  Mit Zitat antworten Zitat
Antwort Antwort


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 07:43 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