Кто-нибудь изучал разницу в запуске скрипта Python в ArcToolbox по сравнению с автономным скриптом? Мне пришлось написать быстрый и грязный сценарий, чтобы преобразовать набор изображений RGB в одну полосу путем выделения полосы 1. В качестве автономного сценария, считывающего и записывающего на мой компьютер, он обрабатывает 1000 изображений одинакового размера примерно за 350 секунд. Запуск того же скрипта из ArcToolbox занимает около 1250 секунд.
import arcpy
import csv
from os import path
arcpy.env.workspace = in_folder
image_list = arcpy.ListRasters()
#Create a CSV file for timing output
with open(outfile, 'wb') as c:
cw = csv.writer(c)
cw.writerow(['tile_name', 'finish_time'])
#Start the timer at 0
start_time = time.clock()
for image in image_list:
#Extract band 1 to create a new single-band raster
arcpy.CopyRaster_management(path.join(image, 'Band_1'), path.join(out_folder, image))
cw.writerow([image, time.clock()])
Я добавил некоторый код, чтобы отслеживать, когда каждая плитка завершает обработку, и экспортировать результаты в виде CSV. Преобразование времени окончания в время обработки происходит в Excel. На графике результатов время обработки примерно одинаково для каждой плитки в виде скрипта, но время обработки линейно увеличивается при запуске в качестве инструмента ArcGIS.
Если данные считываются и записываются на сетевое устройство, увеличение представляется экспоненциальным.
Я не ищу альтернативных способов решения этой конкретной задачи. Я хочу понять, почему производительность этого скрипта со временем снижается при запуске как инструмента ArcGIS , а не как отдельного скрипта. Я заметил это поведение и с другими скриптами.
Ответы:
Это мое мнение: запуск скрипта из ArcToolbox влечет за собой всевозможные скрытые расходы, поскольку инструменты пытаются взаимодействовать / обновлять основное приложение (ArcMap). Все инструменты будут обновлять метаданные, некоторые пытаются обновить окно карты, и MXD записывает все инструменты, которые вы запускаете на панели истории геообработки. Ни одно из этих скрытых воздействий не возникает при работе в IDE.
Таким образом, выполнение цикла всего 1000 раз означает, что MXD хранит 1000 журналов. Поскольку ArcMap является закрытым проприетарным программным обеспечением, мы не имеем представления о том, как на самом деле работает механизм обработки записей журналов, и может ли быть шагом ограничения скорости, если используемая структура данных не способна обрабатывать большие повторения?
Другая проблема может быть связана с тем, что ArcMap является приложением, управляемым событиями, события происходят, когда происходят события, вы перемещаете карту и карта обновляется, вы добавляете данные и включаете кнопку. Я предполагаю, что возможно, что инструменты запускают все виды событий, и приложение становится «перегруженным» ими, когда инструменты используются неоднозначно, но это я догадываюсь?
Я думаю, что нужно разобраться в плюсах и минусах, выставив скрипт как инструмент для скриптов, что облегчает его использование в среде ArcMap, особенно для неопытных пользователей. Это важный вопрос, если вы хотите, чтобы ваш код был принят. Хардкорное число только для вас, без необходимости какого-либо промежуточного контроля качества, затем запустите сценарий в предпочитаемой вами IDE.
источник