В настоящее время я пишу скрипт на Python с использованием модуля arcgisscripting для обработки достаточно большого набора данных (всего ~ 10000 записей), нормализованного для небольшого числа таблиц, всего 8. Процесс состоит из создания элемента, основанного на кортежах координат (x, y), и создания графика (узлов и линий) с использованием отношений в других 7 таблицах для руководства. Конечным результатом является персональная база геоданных (pgdb / fgdb) с узлами и ребрами пространственных наборов данных, которые визуально представляют отношения.
Первоначально я пытался использовать запросы новых таблиц базы геоданных и наборов записей SearchCursor для заполнения таблиц ссылок (InsertCursor) для возникающих отношений «многие ко многим». Это работало очень хорошо, за исключением 15-20 минут времени обработки.
Используя модуль cProfiler в Python, было очевидно, что «перебивание» персональной базы геоданных при выполнении поисковых запросов для заполнения таблиц ссылок запросами курсоров (курсоры поиска и вставки) вызывало ужасающую производительность.
После небольшого рефакторинга мне удалось сократить время обработки до 2,5 минут. Компромиссным решением было частичное построение схемы базы геоданных в коде и ограничение запросов на курсоры с разбивкой по дуге для InsertCursors после того, как все отношения были сопоставлены.
Мой вопрос касается производительности.
- Какие методы использовали люди для поддержания разумного времени вычислений при работе с большим набором данных?
Есть ли какие-либо рекомендуемые ESRI методы, которые я пропустил при поиске оптимизации?
Я понимаю накладные расходы, возникающие при создании курсора с заданным набором символов, особенно если он из личной базы геоданных, хотя после длительного поиска ответов, связанных с производительностью, с этого сайта и Google, у меня сложилось впечатление, что производительность не находится на переднем крае усилий людей ,
- Будучи пользователем продуктов ESRI, можно ли ожидать и оправдывать эти задержки производительности?
ОБНОВИТЬ
После некоторой работы с этим продуктом я собрал список методов оптимизации, которые позволили преобразовать пространственную информацию из собственного формата в базу геоданных. Это было разработано для персональной и файловой базы геоданных. Tidbits:
Читайте ваши данные и рационализируйте их в памяти. Это сократит ваше время пополам.
Создать классы пространственных объектов и таблицы в памяти. Используйте функциональную клавиатуру набора данных 'in_memory', чтобы использовать свою память в качестве оперативного диска, выполнять там свои функции и затем записывать на диск
Для записи на диск используйте CopyFeatureclass для классов объектов и CopyRow для таблиц.
Эти три вещи заняли сценарий, который преобразовал более 100 000 объектов в базу геоданных за 30 минут до 30-40 секунд, включая классы отношений. Их не следует использовать легкомысленно, большинство из вышеперечисленных методов используют много памяти, что может вызвать проблемы, если вы не обращаете внимания.
источник
Ответы:
Хотя на этот вопрос уже был дан ответ, я подумал, что смогу перезвонить и дать свои два цента.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ : Я работал в ESRI в команде GeoDatabase в течение нескольких лет и отвечал за поддержку различных частей кода GeoDatabase (управление версиями, курсоры, EditSessions, история, классы отношений и т. Д. И т. Д.).
Я думаю, что основной источник проблем с производительностью в коде ESRI - не понимание последствий использования различных объектов, в частности, «маленьких» деталей различных абстракций GeoDatabase! Поэтому очень часто разговор переключается на язык, используемый в качестве виновника проблем с производительностью. В некоторых случаях это может быть. Но не все время. Давайте начнем с языковой дискуссии и вернемся назад.
1.- Язык программирования, который вы выбираете, имеет значение только тогда, когда вы делаете что-то сложное, в тесном цикле. В большинстве случаев это не так.
Большой слон в комнате - то, что в основе всего кода ESRI, у вас есть ArcObjects - и ArcObjects написан на C ++ с использованием COM . За связь с этим кодом взимается плата. Это верно для C #, VB.NET, Python или чего-либо еще, что вы используете.
Вы платите цену при инициализации этого кода. Это может быть незначительной стоимостью, если вы делаете это только один раз.
Затем вы платите цену за каждое последующее взаимодействие с ArcObjects.
Лично я склонен писать код для своих клиентов на C #, потому что он прост и достаточно быстр. Однако каждый раз, когда я хочу переместить данные или выполнить некоторую обработку больших объемов данных, которая уже реализована в геообработке, я просто инициализирую подсистему сценариев и передаю свои параметры. Зачем?
Ах да, так что тогда решение, если использовать множество функций геообработки. На самом деле, вы должны быть осторожны.
2. GP - это черный ящик, который копирует данные (потенциально без необходимости)
Это обоюдоострый меч. Это черный ящик, который совершает магию внутри и выдает результаты, но эти результаты очень часто дублируются. 100 000 строк могут быть легко преобразованы в 1 000 000 строк на диске после того, как вы проведете свои данные с помощью 9 различных функций. Использование только функций GP похоже на создание линейной модели GP, и хорошо ...
3. Объединение слишком большого количества функций GP для больших наборов данных крайне неэффективно. Модель GP (потенциально) эквивалентна выполнению запроса действительно очень тупым способом
Не поймите меня неправильно. Я люблю модели GP - это избавляет меня от написания кода все время. Но я также знаю, что это не самый эффективный способ обработки больших наборов данных.
Вы когда-нибудь слышали о Планировщике запросов ? Его задача - посмотреть на оператор SQL, который вы хотите выполнить, сгенерировать план выполнения в форме ориентированного графа, который выглядит во многом как модель GP , посмотреть статистику, хранящуюся в БД, и выбрать наиболее оптимальный порядок их выполнения . GP просто выполняет их в том порядке, в котором вы их размещаете, потому что у него нет статистики, чтобы делать что-то более разумно - вы - планировщик запросов . И угадайте, что? Порядок, в котором вы выполняете вещи, очень зависит от вашего набора данных. Порядок, в котором вы исполняете вещи, может иметь значение между днями и секундами, и вам решать.
«Отлично», говорите вы, я не буду писать сценарии сам и буду осторожен с тем, как пишу вещи. Но понимаете ли вы абстракции GeoDatabase?
4. Непонимание абстракций GeoDatabase может легко укусить вас
Вместо того, чтобы указывать на каждую вещь, которая может создать вам проблему, позвольте мне указать на несколько распространенных ошибок, которые я вижу постоянно, и некоторые рекомендации.
5. И последнее, и не в последнюю очередь ...
Понимать разницу между операциями, связанными с вводом / выводом
Я честно думал о расширении каждого из этих элементов и, возможно, о создании серии записей в блоге, которые охватывают каждую из этих тем, но список невыполненных работ моего календаря просто ударил меня по лицу и начал кричать на меня.
Мои два цента.
источник
Как правило, для вычислений производительности я стараюсь избегать использования каких-либо вещей, связанных с ESRI. Для вашего примера я бы предложил выполнить этот процесс поэтапно, первый шаг - чтение данных в обычные объекты Python, выполнение вычислений, а затем последний шаг - преобразование в окончательный пространственный формат ESRI. Для ~ 10 тыс. Записей вы, вероятно, могли бы избежать хранения всего в памяти для обработки, что дало бы определенный выигрыш в производительности.
источник
В зависимости от имеющегося у вас аппаратного обеспечения вы можете также рассмотреть вариант, отображаемый в примере геокодера ESRI; это дает вам основу для разбиения большого набора данных и запуска нескольких экземпляров python, что дает вам почти многопоточный подход. Я видел, как производительность геокодирования возросла с 180 000 в час в одном экземпляре Python до более чем одного миллиона благодаря ускорению 8 параллельных процессов на моей машине.
Я видел, что как можно больше отдаляя себя, сохраняя работу с данными в базе данных, функциональную работу в моих таблицах и просто используя явную ГИС в области ESRI, значительно повышается производительность.
источник
Вы можете найти эти другие сообщения на форуме интересными, поскольку они находятся в контексте оптимизации, но для растровых данных и в целом:
Компилирование скриптов Python, использующих инструменты геообработки ArcGIS?
Время обработки с использованием инструментов панели инструментов ArcGIS Hydrology в автономном скрипте Python против ArcCatalog?
настройка gp.scratchworkspace сильно повлияла на меня в некотором коде на python, который я написал для разграничения водораздела.
Не могли бы вы опубликовать несколько примеров кода, которые демонстрируют номера 1 и 2 в вашем ОБНОВЛЕНИИ к вашему первоначальному вопросу? Мне было бы интересно увидеть механизм этого (хотя я предполагаю, что вы имеете дело с данными класса пространственных объектов только здесь)
спасибо том
источник