Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Dataset schnell! in eine Datei speichern? (https://www.delphipraxis.net/40993-dataset-schnell-eine-datei-speichern.html)

hitzi 24. Feb 2005 08:53

Datenbank: Informix • Zugriff über: ADO

Dataset schnell! in eine Datei speichern?
 
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

opfer.der.genauigkeit 24. Feb 2005 09:12

Re: Dataset schnell! in eine Datei speichern?
 
Hi,

Ich würde dir empfehlen immer Schrittweise in die Datei zu schreiben,
z.B. immer 500 DS aufeinmal oder so.

Jens Schumann 24. Feb 2005 09:20

Re: Dataset schnell! in eine Datei speichern?
 
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.

Bernhard Geyer 24. Feb 2005 09:32

Re: Dataset schnell! in eine Datei speichern?
 
Zitat:

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.

hitzi 24. Feb 2005 09:49

Re: Dataset schnell! in eine Datei speichern?
 
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?

Bernhard Geyer 24. Feb 2005 10:49

Re: Dataset schnell! in eine Datei speichern?
 
Zitat:

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

hitzi 24. Feb 2005 11:02

Re: Dataset schnell! in eine Datei speichern?
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:24 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