[英]Multiprocessing Pool - most workers are loaded but still idle
在 python 2.7 腳本中,第一個用於處理numpy
數組的大塊的多處理代碼。 這基本上是圖像平面和笛卡爾(世界)平面之間的投影光線幀塊。 那部分,稱為poo1
,工作正常。
在腳本中,我嘗試重現多處理代碼以使用此投影光線幀塊投影大量圖像。
似乎只有 4 到 6 名工作人員在工作,但他們都准備好填寫數據了。 pool2
創建工人,他們在 memory 使用率增長緩慢,其中只有多達 6 個正在使用 CPU 能力。
備注:
Arguments 信息:
代碼的簡化如下所示:
def georef(paramsGeoRef):
#Pseudo workflow
"""
- unpack arguments, Frameclock, A1,A2, B1, B2, fileName, D1, D2, D3, P1, P2 <== paramsGeoRef
- Loading tif image
- Evergy convertion
with function and P1, P2
- Proportional projection of the image
- Frameclock, A1, A2
- Evergy convertion
with function and P1, P2
- Figure creation
- Geotiff creation
- export into file figure, geotiff and numpy file
"""
return None
if __name__ == '__main__':
paramsGeoRef = []
for im in imgfiles:
paramsGeoRef.append([Frameclock, A1, A2, B1, B2, fileName, D1 , D2 , D3 , P1 , P2])
if flag_parallel:
cpus = multiprocessing.cpu_count()
cpus = cpus - 1
pool2 = multiprocessing.Pool(processes=cpus)
pool2.map(georef, paramsGeoRef)
pool2.close()
pool2.join()
我嘗試了不同的方法,例如:
解包之前的爭論:
def star_georef(Frameclock, A1,A2, B1, B2, fileName, D1, D2, D3, P1, P2):
return georef(*paramsGeoRef)
def georef(paramsGeoRef):
#Pseudo workflow...
return None
使用另一個 map 類型:
pool2.imap_unordered()
怎么了? 為什么此方法適用於處理numpy
陣列,但不適用於此目的? 需要處理塊大小?
也許,我可能需要盡快為工人提供工作生成器?
聽從馬蒂諾的建議,
我使用 numpy in.npy 格式保存 Frameclock、A1 和 A2 參數。 然后我在並行化中加載.npy。
如:
def georef(paramsGeoRef):
#Pseudo workflow
"""
- unpack arguments, Frameblock, A1,A2, B1, B2, fileName, D1, D2, D3, P1, P2 <== paramsGeoRef
- load Frameblock from his .npy
- load A1 from his .npy
- load A2 from his .npy
- Loading tif image
- Evergy convertion
with function and P1, P2
- Proportional projection of the image
- Frameclock, A1, A2
- Evergy convertion
with function and P1, P2
- Figure creation
- Geotiff creation
- export into file figure, geotiff and numpy file
"""
return None
即使保存和加載這些也是極大的效率增益。 所有工人工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.