多处理池 - 大多数工作人员已加载但仍处于空闲状态
Multiprocessing Pool - most workers are loaded but still idle
在 python 2.7 脚本中,第一个多处理代码处理一个大块 numpy
数组。这基本上是图像平面和笛卡尔(世界)平面之间的投影射线帧块。那部分称为 poo1
,工作正常。
在脚本的后面,我尝试重现多处理代码以使用此投影射线帧块投影大量图像。
好像只有4到6个工人在工作,但他们都在准备工作填充数据。 pool2
创建工人,他们的内存使用量增长缓慢,其中最多只有 6 个正在使用 CPU power。
截图:
备注:
- 多重处理函数没有输出return,如果文件写在文件夹中则输出;
- 不用担心内存大小问题,半TB可用;
- 不用担心流程的顺序;
- 工人数量是体力 CPU 核心 - 1 = 27;
- 要分发的作业列表的长度 (paramsGeoRef) 可以是 1 到 250 行。
参数信息:
- Frameclock,海量ndarray,可以GB
- A1 : ndarray, 可以是几百MB
- A2 : ndarray, 可以是几百MB
- B1:整数值
- B2:整数值
- 文件名:字符串,名称
- D1 : 字符串,路径
- D2:字符串,路径
- D3 : 字符串,路径
- P1:小数组
- P2:小数组
代码的简化看起来像这样:
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
使用了另一种地图类型:
pool2.imap_unordered()
怎么了?为什么此方法适用于处理 numpy
数组,但不适用于此目的?需要处理块大小?
也许,我可能需要在工作生成器可用时立即为工人提供食物?
按照马蒂诺的建议,
我将 Frameclock、A1 和 A2 与 numpy 的争论保存为 .npy 格式。然后我将 .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
即使保存和加载这些也是一个巨大的效率提升!所有工人都在工作。
在 python 2.7 脚本中,第一个多处理代码处理一个大块 numpy
数组。这基本上是图像平面和笛卡尔(世界)平面之间的投影射线帧块。那部分称为 poo1
,工作正常。
在脚本的后面,我尝试重现多处理代码以使用此投影射线帧块投影大量图像。
好像只有4到6个工人在工作,但他们都在准备工作填充数据。 pool2
创建工人,他们的内存使用量增长缓慢,其中最多只有 6 个正在使用 CPU power。
截图:
备注:
- 多重处理函数没有输出return,如果文件写在文件夹中则输出;
- 不用担心内存大小问题,半TB可用;
- 不用担心流程的顺序;
- 工人数量是体力 CPU 核心 - 1 = 27;
- 要分发的作业列表的长度 (paramsGeoRef) 可以是 1 到 250 行。
参数信息:
- Frameclock,海量ndarray,可以GB
- A1 : ndarray, 可以是几百MB
- A2 : ndarray, 可以是几百MB
- B1:整数值
- B2:整数值
- 文件名:字符串,名称
- D1 : 字符串,路径
- D2:字符串,路径
- D3 : 字符串,路径
- P1:小数组
- P2:小数组
代码的简化看起来像这样:
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
使用了另一种地图类型:
pool2.imap_unordered()
怎么了?为什么此方法适用于处理 numpy
数组,但不适用于此目的?需要处理块大小?
也许,我可能需要在工作生成器可用时立即为工人提供食物?
按照马蒂诺的建议,
我将 Frameclock、A1 和 A2 与 numpy 的争论保存为 .npy 格式。然后我将 .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
即使保存和加载这些也是一个巨大的效率提升!所有工人都在工作。