![]() |
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:
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.
[...]
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; [...] Wie kann ich diese Routine beschleunigen? Gruss |
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. |
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 ![]() csv-Format quasi um ein Standartformat handelt könnte es gut möglich sein. |
Re: Dataset schnell! in eine Datei speichern?
Zitat:
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. |
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 ( ![]() |
Re: Dataset schnell! in eine Datei speichern?
Zitat:
|
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