我有一个arcpy
进程需要在一堆图层上进行联合,运行一些计算并编写HTML报告。鉴于我需要生成的报告数量(约2,100个),我需要尽快完成此过程(我的目标是每个报告2秒)。当我遇到一个问题时,我尝试了很多方法来做到这一点,包括多处理,也就是说,无论使用多少个内核,运行多进程部分的时间本质上都需要相同的时间。多核处理时间线性增加
例如,对于相同数量的报告:
- 2芯花〜30秒每轮(所以40个报告需要40/2 * 30秒)
- 4芯花〜60秒( 40/4 * 60)
- 10芯花〜160秒(40/10 * 160)
等。它的工作时间相同,因为每次翻动两倍的时间需要两次。
这是否意味着我的问题是I/O绑定,而不是CPU绑定?(如果是这样 - 我该怎么办?)我认为这是后者,因为我的时间的大瓶颈是工会(它占用了大约50%的处理时间)。在ArcGIS中,联盟通常很昂贵,所以我认为破解它并且一次运行2 - 10会快2到10倍。或者,可能我错误地实施了多进程?
## Worker function just included to give some context
def worker(sub_code):
layer = 'in_memory/lyr_{}'.format(sub_code)
arcpy.Select_analysis(subbasinFC, layer, where_clause="SUB_CD = '{}'".format(sub_code))
arcpy.env.extent = layer
union_name = 'in_memory/union_' + sub_code
arcpy.Union_analysis([fields],
union_name,
"NO_FID", "1 FEET")
#.......Some calculations using cursors
# Templating using Jinjah
context = {}
context['DATE'] = now.strftime("%B %d, %Y")
context['SUB_CD'] = sub_code
context['SUB_ACRES'] = sum([r[0] for r in arcpy.da.SearchCursor(union, ["ACRES"], where_clause="SUB_CD = '{}'".format(sub_code))])
# Etc
# Then write the report out using custom function
write_html('template.html', 'output_folder', context)
if __name__ == '__main__':
subList = sorted({r[0] for r in arcpy.da.SearchCursor(subbasinFC, ["SUB_CD"])})
NUM_CORES = 7
chunk_list = [subList[i:i+NUM_CORES] for i in range(0, len(subList), NUM_CORES-1)]
for chunk in chunk_list:
jobs = []
for subbasin in chunk:
p = multiprocessing.Process(target=worker, args=(subbasin,))
jobs.append(p)
p.start()
for process in jobs:
process.join()
你的盒子有多少个核心? –
8个物理16“逻辑处理器” – HFBrowning