Delphi-PRAXiS
Seite 3 von 4     123 4      

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)

Luckie 29. Okt 2017 20:58

AW: Große Textdateien spitten
 
Moment. Du schreibst doch in vier? Ich habe jetzt euren Code nicht studiert, aber du hast eine zum Lesen geöffnet und vier zum schreiben. Oder schließt er die zu schreibenden Dateien immer wieder.

muhael 29. Okt 2017 20:59

AW: Große Textdateien spitten
 
Das Habe ich uach schon überlegt, aber jede zeile gibt nach der Analyse auch einen wert wieder, dieser wird mit den schon bestehenden Werten verglichen und geschaut ob er schon vorhanden ist, wenn nicht wird er hinzugefügt. Problem an 4 threads die jeweils eine Zeile haben ist ja dann, dass die threads warten müssen um auf den Speicher von der Liste zugreifen zu können

Fritzew 29. Okt 2017 21:00

AW: Große Textdateien spitten
 
Zitat:

Zitat von Luckie (Beitrag 1384505)
Moment. Du schreibst doch in vier? Ich habe jetzt euren Code nicht studiert, aber du hast eine zum Lesen geöffnet und vier zum schreiben. Oder schließt er die zu schreibenden Dateien immer wieder.

Lies den thread, er will das splitten damit da nachher 4 threads darauf zugreifen können. Deswegen meine Idee mit dem share read, kein shreiben vorher notwendig

muhael 29. Okt 2017 21:01

AW: Große Textdateien spitten
 
Zitat:

Zitat von Luckie (Beitrag 1384505)
Moment. Du schreibst doch in vier? Ich habe jetzt euren Code nicht studiert, aber du hast eine zum Lesen geöffnet und vier zum schreiben. Oder schließt er die zu schreibenden Dateien immer wieder.

ja ich habe 1 zum lesen und 4 zum schreiben geöffnet und schließe sie am ende der Funktion erst

nahpets 29. Okt 2017 21:05

AW: Große Textdateien spitten
 
Zitat:

Zitat von Luckie (Beitrag 1384497)
Wieso suchen? Ans Ende springen müsste doch reichen.

An das Ende von was springen?

1. Zeile -> Datei 1
2. Zeile -> Datei 2
3. Zeile -> Datei 3
4. Zeile -> Datei 4

Und wieder von vorne, bis die Datei vollständig aufgeteilt ist.

Irgendwie muss ich also für jede Zeile wissen, wo sie anfängt und wo sie aufhört. Da die Zeilen unterschiedlich lang sind, kann man ja nicht eine bestimmte Anzahl von Zeichen "am Stück" lesen.

Die Idee von Fritzew ist aber auch nicht von der Hand zu weisen. Man spart viel Plattenplatz und die entsprechenden Schreiboperationen.
Wenn wer jede vierte Zeile verarbeiten muss, kann er ja die übrigen Zeilen überlesen.
Und wo die erste Zeile für den Beginn ist, kann man ja mit einem Offset für die am Anfang zu überlesenden Zeilen angeben.

Und ob jetzt vier Threads vier Dateien lesen oder vier Threads eine Datei, dürfte für den Schreibkopf auch eher egal sein. Bzw.: Das was bei einer Datei gelesen wird, liegt physikalisch vermutlich näher beeinander, als bei auf mehrere Dateien verteilten Inhalten.

Die Sectorgröße ist doch abhängig vom Dateisystem und nicht von der Hardware. Oder irre ich da?

Eine Datei wird in 'ner Schleife gelesen und in vier wird geschrieben. Geöffnet wird am Anfang und am Ende alles geschlossen und nicht zeilenweise auf und zu.

Aber es wäre doch einen Versuch Wert, die Datei nicht zu splitten, sondern jeweils nur die vierte Zeile auszuwerten. Man muss nur am Anfang angeben, ob keine, eine, zwei oder drei Zeilen zu überlesen sind.

Fritzew 29. Okt 2017 21:06

AW: Große Textdateien spitten
 
Zitat:

Zitat von muhael (Beitrag 1384506)
Das Habe ich uach schon überlegt, aber jede zeile gibt nach der Analyse auch einen wert wieder, dieser wird mit den schon bestehenden Werten verglichen und geschaut ob er schon vorhanden ist, wenn nicht wird er hinzugefügt. Problem an 4 threads die jeweils eine Zeile haben ist ja dann, dass die threads warten müssen um auf den Speicher von der Liste zugreifen zu können

Das verstehe ich jetzt nicht,
Ob der Thread nun jede x zeile aus einem File oder jede Zeile aus „seinem“ file liest ist doch egal...
Ich meine ja gib dem Thread mit welche zeile er zu verarbeiten hat also jeder thread verarbeitet nur jede xte zeile. Wobei x für jeden anderst ist
Thread 1 ab erster zeile dann 3überspringen....
Thread 2 ab der 2 zeilw dann 3 überspringen..
Etc....

Glados 29. Okt 2017 21:09

AW: Große Textdateien spitten
 
Zitat:

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?
Dafür müsste man aber auch erstmal an diese Information gelangen.

Luckie 29. Okt 2017 21:11

AW: Große Textdateien spitten
 
Ah. Ja. Bei der zu lesenden Datei. Ich nehme alles zurück und behaupte das Gegenteil ;)

muhael 29. Okt 2017 21:17

AW: Große Textdateien spitten
 
Zitat:

Zitat von Fritzew (Beitrag 1384513)
Das verstehe ich jetzt nicht,
Ob der Thread nun jede x zeile aus einem File oder jede Zeile aus „seinem“ file liest ist doch egal...
Ich meine ja gib dem Thread mit welche zeile er zu verarbeiten hat also jeder thread verarbeitet nur jede xte zeile. Wobei x für jeden anderst ist
Thread 1 ab erster zeile dann 3überspringen....
Thread 2 ab der 2 zeilw dann 3 überspringen..
Etc....

Der Thread gibt auch Werte zurück.
falls er eine Zeile nicht analysieren konnte gibt er die Zeile zurück, diese wird in eine Datei geschrieben (Um nicht den Ram unnötig zu füllen, da ja die Dateien 3-4 GB groß sind)
Analysierte Zeilen werden zurückgegeben und mit der liste der bereits anderen Analysierten Zeilen verglichen und ggf hinzugefügt.

und wenn 4 Threads gleichzeitig 4 Zeilen bearbeiten und dann gleichzeitig die Liste abrufen wollen gibts ja probleme mit dem Zugriff darauf

Fritzew 29. Okt 2017 21:21

AW: Große Textdateien spitten
 
Zitat:

Zitat von muhael (Beitrag 1384517)
Zitat:

Zitat von Fritzew (Beitrag 1384513)
Das verstehe ich jetzt nicht,
Ob der Thread nun jede x zeile aus einem File oder jede Zeile aus „seinem“ file liest ist doch egal...
Ich meine ja gib dem Thread mit welche zeile er zu verarbeiten hat also jeder thread verarbeitet nur jede xte zeile. Wobei x für jeden anderst ist
Thread 1 ab erster zeile dann 3überspringen....
Thread 2 ab der 2 zeilw dann 3 überspringen..
Etc....

Der Thread gibt auch Werte zurück.
falls er eine Zeile nicht analysieren konnte gibt er die Zeile zurück, diese wird in eine Datei geschrieben (Um nicht den Ram unnötig zu füllen, da ja die Dateien 3-4 GB groß sind)
Analysierte Zeilen werden zurückgegeben und mit der liste der bereits anderen Analysierten Zeilen verglichen und ggf hinzugefügt.

und wenn 4 Threads gleichzeitig 4 Zeilen bearbeiten und dann gleichzeitig die Liste abrufen wollen gibts ja probleme mit dem Zugriff darauf

Das ist aber jetzt ein ganz anderes problem, wo helfen Dir da verschiedene Dateien dür den Input?
Im Gegenteil es wird sogar einfacher zu analysieren da es nur einen input gibt


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:08 Uhr.
Seite 3 von 4     123 4      

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