Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Große Textdateien spitten (https://www.delphipraxis.net/194214-grosse-textdateien-spitten.html)

Glados 29. Okt 2017 20:25

AW: Große Textdateien spitten
 
Versuch doch trotzdem mal http://www.delphipraxis.net/151898-s...ei-reader.html .

Das ist sicher noch schneller.

Luckie 29. Okt 2017 20:26

AW: Große Textdateien spitten
 
Und wie wäre es mit der TFileStream klasse?

muhael 29. Okt 2017 20:32

AW: Große Textdateien spitten
 
Zitat:

Zitat von Luckie (Beitrag 1384492)
Und wie wäre es mit der TFileStream klasse?

Läd der Filestream dann nicht die Datei in den Ram?

nahpets 29. Okt 2017 20:33

AW: Große Textdateien spitten
 
TFileStream hab' ich zuerst ausprobiert, war auf meinem Rechner deutlich langsamer (vorausgesetzt, dass ich es vernünftig gemacht haben sollte).

Man muss ja dann im Stream immer nach dem Zeilenumbruch suche und, wenn gefunden, die Ausgabedatei wechseln.

Sowas in der Art?
Delphi-Quellcode:
var
  output : Array[0..3] of TFileStream;
  input : TFileStream;
  i     : Integer;
  ch    : Char;
begin
  input := TFileStream.Create(ParamStr(1),fmOpenRead);
  for i := 0 to 3 do begin
    output[i] := TFileStream.Create(ExtractFilePath(ParamStr(0)) + 'Test_' + IntToStr(i) + '.txt',fmCreate);
  end;
  i := 0;
  input.Position := 0;
  input.Read(ch,1);
  repeat
    output[i].Write(ch,1);
    case ch of
      #10 : begin
              i := i + 1;
              if i > 3 then i := 0;
            end;
    end;
  until input.Read(ch, 1) = 0;
  for i := 0 to 3 do output[i].Free;
  input.Free;
end.

Luckie 29. Okt 2017 20:35

AW: Große Textdateien spitten
 
Wieso suchen? Ans Ende springen müsste doch reichen.

Fritzew 29. Okt 2017 20:38

AW: Große Textdateien spitten
 
Jetzt gebe ich auch noch meinen Senf dazu...
pragmatischer Ansatz
schon mal versucht die Datei im shared readmode für die einzelnen Threads zu öffnen und jedem thread mitzugeben welche
wievielte Zeile er zu lesen hat. Also so was wie
mytread := Tworkethread.create(onlyLine...)

wo dann onlyLine immer der Step ist den er liest also nur 1, 2,3,4... was auch immer Zeile?
Dann kannst Du dir die ganze splitterei sparen, die Information ist ja da..........

Luckie 29. Okt 2017 20:46

AW: Große Textdateien spitten
 
Das Problem dürfte dann aber sein, dass du zwar vier Threads hast, aber die Platte nur einen Schreibkopf. ;) Müsste man aber wohl ausprobieren.

Luckie 29. Okt 2017 20:49

AW: Große Textdateien spitten
 
Nachtrag: SSDs könne auch nur an einer Stelle gleichzeitig schreiben. Nur dürfte der Wechsel zu nächsten Speicherzelle schneller sein. Aber das ist ja der allgemeine Fall bei SSDs.

Fritzew 29. Okt 2017 20:54

AW: Große Textdateien spitten
 
Zitat:

Zitat von Luckie (Beitrag 1384501)
Das Problem dürfte dann aber sein, dass du zwar vier Threads hast, aber die Platte nur einen Schreibkopf. ;) Müsste man aber wohl ausprobieren.

Tja er kann sich aber das erzeugen von 4 Dateien sparen,
Ich weiss es jetzt auch nicht genau, aber ich denke wenn Du nur auf einer Datei liest und darum geht es ja letztendlich dürfte der filecache von Windows schon helfen,
Es ist letztendlich nur eine Datei offen anstatt 4. Meiner Meinung nach , ungetestet müsste das aber die schnellste Lösung sein. Immerhin reden wir von 4 minuten nur für das erzeugen bevor die threads überhaupt anfangen können......

Luckie 29. Okt 2017 20:55

AW: Große Textdateien spitten
 
Nachtrag 2: Bei HDDs macht es sich ja immer gut, wenn die Buffergröße sich an die Sectorgröße des Dateisystems orientiert. Gibt es so was bei SSDs eigentlich noch?


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:00 Uhr.
Seite 2 von 4     12 34      

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