![]() |
Speichern ist ziemlich langsam
Hallo,
ich nutze folgenden Code um ein 3-dimensionales Array in ein Matlabfile zu speichern:
Delphi-Quellcode:
Das klappt auch soweit, nur ist das alles sehr zäh und lahm. G.x, G.y, G.z betragen 100. Es wird also 100^3=1.000.000 mal durchlaufen, was ja im Grunde nicht viel ist für ein 2.5GHz Rechner. Kann es eventuell sein daß FloatToStr extrem langsam ist und sich nach 1000000 mal bemerkbar macht?
{ 3D-Matrix mit Parametern }
for iz := 0 to G.z-1 do begin V_line := format('%s (:,:,%d) = [',[ArrayName,iz+1]) ; for ix := 0 to G.x-1 do begin for iy := 0 to G.y-1 do with Thread.Cells[ix,iy,iz] do begin V_line := V_line + format('%s ',[FloatToStr(C)]) ; if (iy = G.y-1) and (ix < G.x-1) then begin V_line := V_line + '; ' ; end ; end ; end ; V_line := V_line + '] ;' ; writeln (FF,V_line) ; V_line := '' ; end ; |
Re: Speichern ist ziemlich langsam
Hi Tom,
durch FloatToStr wirst du wohl durchmüssen. Die einzige Zeitersparnis erreichst du, wenn du die Daten im Speicher ablegst (z.B. in einem FileStream) und anschließend alles in einem Zug in die Datei schreibst. Inwiefern dies schneller ist, kann ich dir nicht genau sagen. Ich habe bei einem Filespeicher-Algorithmus jedenfalls festgestellt, dass er am schnellsten läuft, wenn ich 512 Bytes auf einmal schreibe. Greetz alcaeus |
Re: Speichern ist ziemlich langsam
Du benutzt G.z mal :
Delphi-Quellcode:
Könnte man das nicht auch zuerst mal in ein Array legen und auf einen Schlag wegschreiben ?
writeln (FF,V_line) ;
|
Re: Speichern ist ziemlich langsam
Zitat:
Aber vielleicht ist ja das Schreiben mittels writeln(FF,V_Line) auch der Grund, und ich tät besser dran, mit FileStreams o.ä. zu arbeiten. Danke aber schon mal. |
Re: Speichern ist ziemlich langsam
FloatToStr ist sehr langsam, das stimmt. Aber Du könntest doch die Werte im nativen Format speichern, oder? Dann würdest Du eine Million Aufrufe zu FloatToStr eingespart.
...:cat:... |
Re: Speichern ist ziemlich langsam
aber er will sie doch danach in MatLab reinsaugen. Und ich glaube, es ist besser die Verrenkungen in Delphi zu machen, und MatLab normal einlesen zu lassen, als andersrum.
|
Re: Speichern ist ziemlich langsam
Hallo Jelly,
ich habe Dein Programm mit diesen Daten
Delphi-Quellcode:
in AQTime untersucht und mein Verdacht, dass die Stringverarbeitung der limitiernde Faktor ist, hat sich bestätigt. Hier die Ergebnisse:
const
GX = 50; GY = 50; GZ = 50; arrayname = 'AnArrayName'; g:record x,y,z: Integer end = (x:GX; y:GY; z:GZ); var iz, iy, ix: Integer; v_line: string; Thread: record Cells: array[0..GX-1, 0..GY-1, 0..GZ-1] of record c: double; end; end; FF: Textfile;
Code:
über 85% der Zeit innerhalb der Schleife wird folglich mit der Zusammensetzung verbracht und nur ein geringer Teil des Rests mit dem Schreiben auf den (lokalen) Datenträger.
Routine Name | % with Children | with Count
-------------+-----------------+------------ Format | 32,15 | 125050 FloatToStr | 28,51 | 125000 LStrCat | 26,81 | 127500 Suche im Forum einmal nach Beiträgen von Hagen aka negaH zum Thema String-Konkatenation uä, um einen genaueren Überblick über die Thematik zu erlangen. |
Re: Speichern ist ziemlich langsam
Îch würde es testen, um zuerst einmal zu sehen, wie sich das ganze auswirkt. Also 100mal 10.000Byte wegschreiben und 1mal 1.000.000. Das Zeitverhalten des 100mal Schreib-Programmes 8) kannst du dann vergleichen mit deinem. Der Unterschied ist FloatToStr. Anderenfalls bleibt das hier nur Raterei.
Ich habe hier ein Programm, das schreibt 100.000 Datensätze in DB. Lasse ich hierbei nur einen Zähler in einem Memo mitlaufen, so ist es um den Faktor 3 langsamer. Das sind so Effekte, die man nicht unbedingt erwarten würde. |
Re: Speichern ist ziemlich langsam
Zitat:
...:cat:... |
Re: Speichern ist ziemlich langsam
Zitat:
Vielen Dank für dir zahlreichen Antworten. Gruß |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:34 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