Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Scan for Files mit der PPL (https://www.delphipraxis.net/204692-scan-files-mit-der-ppl.html)

Smiley 19. Jun 2020 10:53

Scan for Files mit der PPL
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Delphi Freunde

Ich habe mich etwas mit der PPL (parallel programming library) beschäftigt und damit einige Gehversuche gestartet.
Am Besten hat mir das CodeRage 2016 Session6 Video von Olaf Monien gefallen.
Die Embarcadero Hilfe zu PPL habe ich mir auch angesehen.
Am leichtesten verstehe ich es aber durch Beispiele.
Als Beispiel zum ausprobieren habe ich mir folgendes ausgedacht:
Einlesen von Verzeichnissen (FindFirst,FindNext) und messen der Geschwindigkeit bei mehreren Tasks.
Dass hier eine Begrenzung durch das Filesystem gegeben ist ist mir klar, ich wollte herausfinden wie weit threading hier sinnvoll ist.
Es macht natürlich einen Unterschied ob ich auf eine Festplatte,SSD oder LAN zugreife. Eventuell auch auf mehrere davon gleichzeitig, was eine parallelisierung sinnvoller macht.

Beispiel Verzeichnisse einlesen:
Ich habe ein Startverzeichnis mit 10 Unterverzeichnissen, diese haben ebenfalls Unterverzeichnisse, insgesamt 100 UnterUnterverzeichnisse und einige tausend Dateien.
Mit Filesearch sollen alle Verzeichnisse mit maximal 3 Threads gelesen werden.
Wenn ein SubSub..Dir beendet wurde, soll die Trackbar erhöht werden. Trackbar.max ist schon ein Problem, da ich noch nicht weiß wieviele SubDirs ich habe.
Eventuell das mit readDirs erst mal vorab einlesen ? wenn das nicht schon zu lange dauert.
Wie könnte man das am effektivsten lösen ?

Das beigelegte BeispielProjekt ist ein Anfang dazu. Die folgenden wichtigen Punkte sind aber noch nicht drin:

1. Threadpool (TThread.Queue) benutzen um nur eine begrenzte Anzahl von Tasks gleichzeitig laufen zu lassen ohne parallel.for ( MaxThread:=3; )
2. Thread Events benutzen (OnTerminate) kann ich darin auf threadvariablen zugreifen ? (ThreadStatus,threadID)
3. Kann ich die StopWatch im Thread benutzen um die threadzeit zu messen ?
4. System.Monitor.Enter(self); try inc(Taskcounter); finally System.Monitor.Stop(self); end; Ist das wie Synchronize um Variablen im Haupthread zu verändern. Welche Vorteile bringt das ?
5. Den Status der Threads, aus dem MainThread, lesen um festzustellen welcher Thread noch läuft. Kein WaitFor.. ich will im MainThread derweil noch andere Dinge machen.
6. Trackbar.Position bewegen wenn ein Thread seine Aufgabe erfüllt hat.
7. Wie kann ich durch einen Cancel Button alle Tasks abbrechen ?

Ich benutze Delphi 10.4 Architect auf Windows 10 1909. TMS AllAccess vorhanden. (In Bereich Filesearch oder Tasks hat TMS aber glaube ich nichts spezielles enthalten)

himitsu 19. Jun 2020 12:24

AW: Scan for Files mit der PPL
 
Vor allem bei richtigen HDDs, wo noch nichts im Cache ist, macht man sich so eher langsamer, als schneller.
Und auch bei SSDs ist ein Thread mit vollem Tempo nicht viel langsamer, als zwei Threads mit halben Tempo, bzw. Mehr mit noch kleinerem Bruchteil.

Besser als parallel ist hier die richtig Wahl der Listenfunktionen, welche kein elendlig langsames "Caching" und Sortieren betreiben, wie die normalen FindFirst/FindFirstFile.

DieDolly 19. Jun 2020 12:40

AW: Scan for Files mit der PPL
 
Zitat:

Besser als parallel ist hier die richtig Wahl der Listenfunktionen, welche kein elendlig langsames "Caching" und Sortieren betreiben, wie die normalen FindFirst/FindFirstFile.
Hättest du hierfür ein Beispiel wie man mit deiner Idee ein Verzeichnis mit allen Unterverzeichnisen rekursiv durchsucht und in einer Liste packt?

Smiley 19. Jun 2020 13:07

AW: Scan for Files mit der PPL
 
@himitsu Von diesen Listenfunktionen habe ich noch nichts gelesen, kannst Du das näher beschreiben.

Dass der Einwand kommt, dass es nicht sinnvoll ist Threading mit Dateifunktionen zu verknüpfen habe ich schon kommen sehen, das ist mir auch bewusst, arbeite aber gerade damit und habe das als Beispiel genommen.
Der Weg ist das Ziel.
Lassen wir also den Sinn dieses Beispiels mal weg und sehen ob ich was zu PPL lernen kann.
Ich habe schon so viel über die Möglichkeiten und Probleme des PPL gelesen und wollte das jetzt mal umsetzen.
Dieses Beispiel ist immer noch besser als die Sleep Funkionen die sonst so verwendet werden.

himitsu 19. Jun 2020 13:55

AW: Scan for Files mit der PPL
 
Leider noch nicht, hatte vor 2 Wochen mal wieder einen Test dazu angefangen, aber Zeitmangel ....
Hatte angefangen eine kleine Testanwendung zu schreiben, um da mal alle Möglichkeiten gegenüberzustellen und zu vergleichen,
mit lokaler Festplatte und SMB zum NAS, frisch ohne Cache und mit gefülltem Cache. (mit über 1,5 Millionen Dateien in knapp 6 TB und viel zu vielen kleinen Verzeichnissen und ein paar viel zu großen Verzeichnissen ... geht mal mit dem Explorer ins WinSxS :stupid:)

* RawDaten der Platte auslesen und Dateisystem selber parsen (schön schnell, aber das will Niemand, außer Forensikern und Datenrettern)
* MasterFileTable auslesen auch schnell, aber dafür braucht man höhere Rechte, also nicht praktikabel
* Shell Interfaces : MSDN-Library durchsuchenIEnumShellItems, bzw. das alte MSDN-Library durchsuchenIShellFolder ... weiß noch nicht (denke es sollte langsamer sein, aber wäre nicht überascht es wäre das nicht)
* Delphi-Referenz durchsuchenTDirectory.GetFiles nutzt FindFirst (wobei gier die Funktionen/Parameter/Rückgaben teils etwas "unglücklich" sind, wenn man das "effektiv" nutzen und nichts doppelt behandeln)
* Delphi-Referenz durchsuchenFindFirst nutzt MSDN-Library durchsuchenFindFirstFile, mit bissl teilweise blödsinnigem Overhead (alles Suchen und dann filtern ... kann auch sein, das ich es grade mit GetFiles verwechsel)
* MSDN-Library durchsuchenFindFirstFileEx statt MSDN-Library durchsuchenFindFirstFile geht schon besser (mit den richtigen Optionen)
* am Besten lief es mit der Bei Google suchenNative-API, was langsam nutzbar ist, seitdem Microsoft anfängt die offiziell zu Dokumentieren und es somit nicht mehr per se heißt "die ist intern und geheim und kann sich jederzeit unvorhersehbar ändern oder die 'Hacker' haben die API falsch entschlüsselt"

Vielleicht such dich später mal meinen Testcode raus ... Mal sehn, ob ich mit dem Fingerabdrucksensor noch vor Sonntagabend fertig werde und mich dann langweile.

DieDolly 19. Jun 2020 14:00

AW: Scan for Files mit der PPL
 
Zitat:

* FindFirstFileEx statt FindFirstFile geht schon besser (mit den richtigen Optionen)
Die sind deiner Meinung nach? :thumb: (FindExInfoBasic, FIND_FIRST_EX_LARGE_FETCH ?)
Findet FindFirstFileEx, wie der Name nur sagt, nur Dateien?

himitsu 19. Jun 2020 14:16

AW: Scan for Files mit der PPL
 
Ja, z.B.

Nee, es findet "Einträge" im Dateisystem, also Dateien, Verzeichnisse, ...
Auf Verzeichnissen vom Unix/Linux (gibt es jetzt ja auch im Windows und über Netzwerkfreigaben), da kann eine "Datei" ALLES sein, auch eine Hardware oder ein Programm.

Windows : ALLES ins ein Fenster
Linux : ALLES ist eine Datei
Postgres : ALLES in eine Tabelle
:stupid:

Daniel 19. Jun 2020 14:21

AW: Scan for Files mit der PPL
 
Bedenkt bitte, dass Ihr Euch hier in einem Thema zu "PPL und Dateisystem" befindet.

DieDolly 19. Jun 2020 14:21

AW: Scan for Files mit der PPL
 
Für einen großen test hast du keine Zeit. Kannst du ein Minimalbeispiel posten damit man das mit dem PPL-Zeug vergleichen kann?

Smiley 20. Jun 2020 20:11

AW: Scan for Files mit der PPL
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe noch etwas herumprobiert um die Tasks abbrechen zu können, das funktioniert leider nicht.
Habe auch eine Verzeichnisauswahl eingebaut, ab der gesucht wird.
Bei kleinen Mengen von Dateien geht es recht schnell und man sieht die Probleme nicht.
Ab 10000 Dateien und mehr kommt aber schon "keine Rückmeldung" und Button "Abbrechen" führt auch nichts aus, da das Programm zu beschäftigt ist.
Das auflisten der Dateien kommt auch erst ganz zum Schluss.
Selbst das warten auf die Tasks bringt nichts.
Die Variable FileAnz wird nicht hochgezählt.

Das neue File ist hier angehängt.
Finde den ändern Button für den ersten Beitrag nicht.

Ich hoffe es kann sich noch mal jemand damit beschäftigen.
Im Projekt werden nur Standardfunktionen verwendet, sollte überall laufen.

Schönes Wochenende noch und habt Spass bei dem schönen Wetter.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:29 Uhr.
Seite 1 von 3  1 23      

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