Ich habe eine Swift-App auf macOS. Batch-verarbeitet Bilder. Ich weiß nicht im Voraus, wie groß diese Bilder sein werden und auf welcher Hardware meine App läuft - diese sind beide benutzerabhängig.Wie kann ich meine Mac OS App Tasks so weit wie möglich parallelisieren, ohne den Arbeitsspeicher zu verlieren?
Ich benutze GCD, um die Verarbeitung der Bilder zu parallelisieren, da es den Durchsatz wirklich beschleunigen kann.
In einigen Fällen kann jedoch zu viel Parallelisierung schaden: Wenn der Benutzer hochauflösende Bilder verarbeitet, erzeugt die Parallelisierung zu viel Speicherdruck und die Systemleistung wird sehr schlecht.
Also ich würde gerne einen Weg finden, "meine parallele Task-Prozessor" mit einer Geschwindigkeit, die Parallelisierung maximiert, während die Arbeitsbelastung im RAM (so dass es keine Trigger zum Auslagern & Swapping: Ich möchte vermeiden Festplatte IO).
Irgendwelche Ideen, wie man das macht?
Wie parallelisieren Sie? Ich meine, teilen Sie jedes Bild über die verfügbaren Kerne oder verarbeiten Sie mehrere Bilder parallel? –
Ich verarbeite mehrere Bilder parallel. Wenn ich die Arbeit für ein Bild parallelisieren könnte, wäre dieses Problem nicht so wichtig. Vielleicht muss ich mich mehr anstrengen (es hat auch den Vorteil geringerer Latenz, wenn wir nur ein Bild verarbeiten), aber die Frage steht immer noch. – BearOverflow
Update: Was ich befürchtet habe, ist wahr - der Teil, der parallelisiert werden kann, profitiert nicht so sehr von der Parallelisierung. Der Overhead beim Erstellen von parallelen Tasks nimmt die Vorteile der CPU-Effizienzgewinne weg. Der beste Parallelisierungsfaktor für diesen Teil ist 2 (darüber hinaus werden keine Gewinne mehr erzielt), was nett ist, aber es macht erst einen Unterschied mit massiven Bildern (8192x8192), was nicht der nominelle Anwendungsfall ist. Für den nominalen Anwendungsfall glaube ich, dass die geringfügige Verbesserung die Komplexität des Codes nicht gewährleistet. Die Frage steht also wirklich noch. – BearOverflow