![]() |
AW: Große Textdateien spitten
Versuch doch trotzdem mal
![]() Das ist sicher noch schneller. |
AW: Große Textdateien spitten
Und wie wäre es mit der TFileStream klasse?
|
AW: Große Textdateien spitten
Zitat:
|
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. |
AW: Große Textdateien spitten
Wieso suchen? Ans Ende springen müsste doch reichen.
|
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.......... |
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.
|
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.
|
AW: Große Textdateien spitten
Zitat:
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...... |
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 04:28 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