2016-11-03 3 views
0

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?)

+0

Wenn die Bilder groß sind, werden Sie eine Menge Zeit verschwenden, indem Sie sie einfach zwischen den Prozessen verschieben. – BlackBear

+0

@BlackBear Dies ist der Grund, warum ich es in Brocken gemacht habe, war aber überrascht, dass es langsamer ist. –

+0

@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. –

Antwort

-1
pool.map(preprocess_images, [imgs for imgs in chunks]) 

würde den Job schneller als beide.

+0

hinzufügen mehr Infos über die Antwort .... – sushildlh

Verwandte Themen