Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi TStreamReader & TFileStream freeze nach laden von 140k Zeilen in Record. (https://www.delphipraxis.net/208836-tstreamreader-tfilestream-freeze-nach-laden-von-140k-zeilen-record.html)

gemy 19. Sep 2021 20:21

TStreamReader & TFileStream freeze nach laden von 140k Zeilen in Record.
 
Guten Abend!

Ich lade eine Textdatei mit 140.000 Zeilen die so aufgebaut ist in ein Record:


Code:
2020.01.17,03:55,13476.49000,13476.74000,13471.74000,13472.74000,56
Das ist eine "Kerze" vom Dax (Also Datum, Uhrzeit, Open, High, Low, Close, Volumen)

Das Record sieht so aus:

Code:
type
  Tcandleprice = (sopen, slow, shigh, sclose);
  Tcandle = record
    sdate: string[20];
    stime: string[5];
    candleprice: array [Tcandleprice] of word;
    ivolume: integer;
  end;
  Tcandles = array of Tcandle;

Ich lad auch alle Zeilein erfolgreich in das Record, aber am Ende nachdem ich den TstreamReader oder den Tfilestream freigebe hängt das Programm circa 10 Sekunden lang. Sogar der Delphi Debugger hängt wenn man auf das rote Viereck für Stop drückt. Andere Programm lassen sich auch nicht in den Vordergrund bringen. Während er gerade die Datei lädt, kann ich nichtmal hier in das Forum Fenster klicken (wo ich gerade diesen Text schreibe).

Die Zeilen werden aber alle erfolgreich eingelesen. Aber warum dauert das am Ende noch so lange ?


Hier habe ich einen vereinfachten Code und auch dieser macht 10 Sekunden Pause am Ende.


Code:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
type
  Tcandleprice = (sopen, slow, shigh, sclose);
  Tcandle = record
    sdate: string[20];
    stime: string[5];
    candleprice: array [Tcandleprice] of word;
    ivolume: integer;
  end;
  Tcandles = array of Tcandle;

var
  Form1: TForm1;
  candles: Tcandles;
implementation

{$R *.dfm}




procedure TForm1.Button1Click(Sender: TObject);
var
  filename: string;
  sr: TStreamReader;
  sl: TStringList;
  total, blocksize: integer;
  i, anzahlkerzen: integer;
  sepstring: char;
  aline: string;
begin
  anzahlkerzen :=0;
  Sepstring := FormatSettings.DecimalSeparator;
  filename := '[DAX30]5.csv';
  sl := TStringList.Create;
  sr := TStreamReader.Create(filename, true);
  sl.Capacity := sr.BaseStream.Size div 100;
  total := 0; // Total number of lines in the file (after it is read in)
  blocksize := 10000; // The number of lines per "block"
  try
    sl.BeginUpdate;
    try
      while not sr.EndOfStream do
        begin
          sl.Clear;
          while not (sl.Count >= blocksize) do
            begin
              sl.Add(sr.ReadLine);
              total := total + 1;
              if (sr.EndOfStream = true) then break;
            end;
          // Handle the current block of lines here
          for i := 0 to sl.Count-1 do
          begin
            SetLength(candles, Length(candles)+1);
            aline := sl[i];
            candles[AnzahlKerzen].sdate := Copy((aline), 1, Pos(',',(aline))-1);
            Delete(aline, 1, Pos(',', (aline)));
            candles[AnzahlKerzen].stime := Copy((aline), 1, Pos(',', (aline))-1);
            Delete(aline, 1, Pos(',', (aline)));
            candles[AnzahlKerzen].candleprice[sopen] := StrtoInt(StringReplace(Copy((aline), 1, Pos(',', (aline))-7),'.', sepstring,[]));
            Delete(aline, 1, Pos(',', (aline)));
            candles[AnzahlKerzen].candleprice[shigh] := StrToInt(StringReplace(Copy((aline), 1, Pos(',', (aline))-7),'.', sepstring,[]));
            Delete(aline, 1, Pos(',', (aline)));
            candles[AnzahlKerzen].candleprice[slow] := StrToInt(StringReplace(Copy((aline), 1, Pos(',', (aline))-7),'.', sepstring,[]));
            Delete(aline, 1, Pos(',', (aline)));
            candles[AnzahlKerzen].candleprice[sclose]:= StrToInt(StringReplace(Copy((aline), 1, Pos(',', (aline))-7),'.', sepstring,[]));
            Delete(aline, 1, Pos(',', (aline)));
            candles[AnzahlKerzen].ivolume := StrToInt(aline);
            inc(AnzahlKerzen);
            if anzahlkerzen mod 9999 = 9998 then memo1.Lines.Add('durchgang');
            form1.Caption := 'Candle Bot - reading Candle Nr.:'+inttostr(AnzahlKerzen)+' from '+ ExtractFileName(filename);
          end;
        end;
    finally
      sl.EndUpdate;
    end;
  finally
    sr.free;
    sl.Free;
  end;


end;


Noch was, als ich noch unter Window7 programmiert habe, da war mit dem selben Programm das Problem nicht zu sehen. Nur mit Windows 10. Habe das auch schon auf einen Server geladen und auch dort macht es seine Pause.

Ich habe nun schon statt currency word genommen, string länge festgelegt, setlength weggelassen und anfangs festgelegt, aber das Programm macht immer eine 10 Sekunden Pause nachdem es alles eingelesen hat.

Woran liegt das?



PS: Hier habe ich einen Downloadlink, falls sich jemand erbarmen möchte (nur source mit csv datei)

https://www.file-upload.net/download...nlesen.7z.html

Klaus01 20. Sep 2021 06:08

AW: TStreamReader & TFileStream freeze nach laden von 140k Zeilen in Record.
 
Guten Morgen,

Delphi-Quellcode:
   inc(AnzahlKerzen);
   if anzahlkerzen mod 9999 = 9998 then memo1.Lines.Add('durchgang');
   //form1.Caption := 'Candle Bot - reading Candle Nr.:'+inttostr(AnzahlKerzen)+' from '+ ExtractFileName(filename);
wenn Du das Update der Form Caption auskommentierst - legt Dein Programm keine Pause mehr ein.

Grüße
Klaus

gemy 20. Sep 2021 06:17

AW: TStreamReader & TFileStream freeze nach laden von 140k Zeilen in Record.
 
ICH WERD VERRÜCKT !

:-D:-D:-D

Danke!

Wie kann das an dem liegen, wo das Programm doch am Ende hängen bleibt? Mir ist klar das die Form jedes mal neu gezeichnet werden muss, aber der hänger passiert ja am Ende.

Jetzt ist es auf jeden fall weg !

Ich kann es kaum glauben :shock:


Großen Dank.:-D

Klaus01 20. Sep 2021 06:32

AW: TStreamReader & TFileStream freeze nach laden von 140k Zeilen in Record.
 
Liste der Anhänge anzeigen (Anzahl: 1)
.. wenn das Programm ferig ist, is Windows noch nicht mit dem Update der Caption ferig.
Du bombardierst Windows mit Update Messages die verarbeitet werden müssen.

Die Caption Updates vielleicht nur alle 1000 Durchläufe machen (siehe Anhang)

Grüße
Klaus

gemy 20. Sep 2021 06:54

AW: TStreamReader & TFileStream freeze nach laden von 140k Zeilen in Record.
 
CommaText kannte ich auch noch nicht :)


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