Ich habe ein seltsames Verhalten mit Python Multiprocessing Pool-Leistung. Im folgenden Code ist data
ein ndarray von Millionen von Bildern, die in der Größe geändert werden müssen, und chunks_list
ist Brocken von data
. Ich benutze pool = Pool(14)
. Die Funktion resize_images
ändert die Größe einer Bildergruppe auf einmal, während die Größe resize_image
die Größe eines Bilds ändert. Der folgende Code:Multiprocessing Pool schlechter Leistung auf Chunks
res = [pool.apply_async(resize_image, args=[img]).get() for img in data]
ist schneller als dieser Code:
chunks_list = [data[i:i + chunk_size] for i in range(0, len(data), chunk_size)]
res = [pool.apply_async(resize_images, args=[imgs]).get() for imgs in chunks_list]
Warum ist das so? Ich habe erwartet, dass das Gegenteil der Fall ist, denn der erste Code wird dem CPU-Pool viele "kleine" Prozesse zuweisen. Aber Stücke produzieren weniger Zuordnungen. Gibt es einen effizienteren Weg, um das zu erreichen, was ich will? (GPU vielleicht?)
Wenn die Bilder groß sind, werden Sie eine Menge Zeit verschwenden, indem Sie sie einfach zwischen den Prozessen verschieben. – BlackBear
@BlackBear Dies ist der Grund, warum ich es in Brocken gemacht habe, war aber überrascht, dass es langsamer ist. –
@BlackBear Bitte beachten Sie, dass die Funktion resize_images die Größe von Bildgruppen auf einmal ändert, im Gegensatz zu resize_image, das die Größe eines einzelnen Bildes ändert. –