我有一個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