![]() |
Multithread und File I/O bei SSD/HDD
Ich lese JPG ein und erstelle Vorschaubilder. Jetzt habe ich mal überprüft, welche Auswirkungen das hat, wenn ich Multithreading verwende, und das jeweils bei einer SSD und zwei herkömmlichen Festplatten (FP).
Material waren ~1.200 JPG mit insgesamt ~5 GB. Gemessen habe ich einmal mit und einmal ohne Platten-Cache (Rechner-Neustart). Verwendet habe ich nach längerem Überlegen AsyncCalls von Andreas Hausladen in der Modifikation von ![]() Ergebnisse (gerundet, kommt ja auf die Größenordnung an): Nach Neustart (Singlethread): SSD: 85 sec FP1: 90 sec FP2: 90 sec Beim Zweitstart (Singlethread): SSD: 85 sec FP1: 85 sec FP2: 85 sec Nach Neustart (Multithread): SSD: 30 sec FP1: 180 sec FP2: 290 sec Beim Zweitstart (Multithread): SSD: 23 sec FP1: 25 sec FP2: 25 sec Von der HDD-LED und vom Kraspeln her vermute ich stark, dass die Dateien auf der FP2 sehr viel verstreuter lagen als auf der FP1. Das vorläufige Fazit ist, dass bei einer SSD Multithreading ein Muss ist, bei einer HDD ein DarfNicht. Ich habe überlegt, ob ich das Datei-Einlesen in einen eigenen Threadpool auslagern könnte, aber das geht nicht, da ich ich die Extract-Methode des IExtractImage benutze. Jetzt könnte ich feststellen, ob die Dateien auf einer SSD liegen, und die entsprechende Strategie wählen. Das würde auch klappen, aber wie ich ![]() Gibt es da Ideen zu? |
AW: Multithread und File I/O bei SSD/HDD
Wenn das Prüfen auf SSD wegfällt, könntest du als Workaround auch einen kleinen Teil der Dateien normal und einen multithreaded auslesen, anschließend vergleichen, was schneller ging und damit fortfahren.
|
AW: Multithread und File I/O bei SSD/HDD
Moin,
ich kann mich dunkel daran erinnern, dass es bei SCSI Laufwerken über SCSI INQUIRY die Möglichkeit gab, die Rotationsgeschwindigkeit abzufragen, für "SSD"s (gab's damals noch nicht --> waren EPROM-Lösungen) gab's dann einen entsprechenden Rückgabewert. Ob sich das für "normale" Festplatten umsetzen lässt, weiß ich allerdings nicht . . . |
AW: Multithread und File I/O bei SSD/HDD
Zitat:
|
AW: Multithread und File I/O bei SSD/HDD
Das Zauberwort heißt Pipeline.
|
AW: Multithread und File I/O bei SSD/HDD
War ja auch meine Idee, aber nach viel Experimentieren fand ich seinerzeit den Weg über IExtractImage (Achtung: Interface! :wink:) mit GetLocation und Extract am schnellsten. Und da kann man Bild-Lesen und Vorschau-Erstellen nicht trennen.
|
AW: Multithread und File I/O bei SSD/HDD
Zitat:
|
AW: Multithread und File I/O bei SSD/HDD
Äh - weil Extract beides macht und in der Shell32.dll sitzt (dachte ich jedenfalls) ???
In gewisser Weise hat sich das aber erledigt, weil ich Benedikt Magnus' simple, aber geniale Idee (fällt ja öfter zusammen) mal ausprobiert habe, und siehe da, Multithread ist auch bei HDD besser, wenn die Dateien noch im Cache sind (ich messe jetzt auch bei FP1 und FP2 um die 25 sec, wie bei der SSD, habe mich also vermutlich bei der ersten Auflistung vertan). Insofern entfällt die Unterscheidung zwischen HDD und SSD. Hat eigentlich auch was für sich, wenn man einfach das nimmt, was schneller ist. Ich messe jetzt erst n Dateien Single-Thread, dann n Dateien Multi-Thread und vergleiche. n ermittle ich nach der Formel von MaxThreads von AsyncCalls, NumberOfCores * 2 - 2, also einmal eine Poolgröße. Ist die Gesamtanzahl Dateien kleiner als 2 * n, dann ist es eh egal. |
AW: Multithread und File I/O bei SSD/HDD
Hi,
wenn du noch Optimierungsbedarf hast, dann hab ich noch zwei Anregungen. Zum einen stelle ich mir die Frage, ob du nach jedem einzelnen Testlauf einen Rechnerneustart durchgeführt hast. Der Festplattencache des Betriebssystems kann dir sonst ganzschön die Ergebnisse versauen. Zum anderen muss ich Sir Rufo zustimmen. Deine CPU ist immernoch den größten Teil der Zeit damit beschäftigt auf die Festplatte zu warten. Erst wenn das Bild vollständig geladen wurde, kann sie rechnen. Anschließend ist sie erneut mit warten (speichern + neues Bild laden) beschäftigt. Mitteils einer Pipeline kannst du Laden, Bearbeiten und Speichern in mehrere Threads auslagern. Du kannst damit einen Puffer benutzen, der immer so viele Bilder wie möglich im RAM vorhält; egal ob gerade erst gelesen und fertig zum abspeichern. Mit einer ausreichenden Menge Arbeitsspeicher lässt sich dein Vorgang so sicherlich nochmals drastisch beschleunigen. ![]() |
AW: Multithread und File I/O bei SSD/HDD
Kann man das nicht Paralleliesieren?
1. Schritt 1. Bild lesen 2. Schritt 1. Bild verarbeiten 2. Bild lesen 3. Schritt 3. Bild lesen 2 Bild verarbeiten Wenn man das erste Bild verarbeitet, das zweite Bild lesen. Also eben versetzt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:33 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