Каков правильный синтаксис и использование для рабочего пространства ArcGIS «in_memory»?
33
Мне неясно, как лучше использовать in_memoryрабочее пространство в ArcGIS. Лучший ресурс, который я нашел по этому вопросу, - это ESRI по использованию рабочей области в памяти . К сожалению, раздел справки не очень информативен. Также на этом сайте есть пост, который кратко затрагивает эту тему здесь и здесь .
Мои конкретные вопросы:
Как правильно использовать синтаксис для использования in_memoryрабочей области в скриптах на основе ArcGIS / arcpy?
Является ли in_memoryрабочая область такой же, как, например, создание слоя с использованием arcpy.MakeFeatureLayer_management()?
Существуют ли какие-либо стандарты, такие как удаление in_memoryрабочей области в конце скрипта?
Я использовал "in_memory" совсем недавно. Это может быть очень полезно, так как потенциально может значительно увеличить скорость обработки для определенных задач, однако, если вы работаете с очень большими наборами данных, это может привести к сбою вашей программы.
Вы можете использовать "in_memory" для определения выходных данных процесса ... часто, если я выполняю задачу в классе пространственных объектов, я сначала скопирую его в рабочую область "in_memory":
Обратите внимание, что вам не нужно объединять memoryFeature вместе, как я, вы можете записать это как «in_memory \ myMemoryFeature», мне просто нравится делать это таким образом, чтобы легко переключаться между «in_memory» и физическим каталогом. Затем вы можете выполнять процессы на вашей функции в памяти. Когда вы закончите, вы можете отменить процесс, чтобы сохранить его обратно в каталог.
Я могу ошибаться, но я считаю, что это не то же самое, что создание векторного слоя. Слои объектов дают вам доступ к методам выделения и другим специфическим для слоя операциям Думайте о каталоге "in_memory" как о векторном эквиваленте растровому объекту (raster = arcpy.Raster (myRasterLocation))
Для очистки после использования "in_memory" просто добавьте следующую строку кода:
Я согласен с @egdetti. Это очень полезно, очень мощно и значительно ускоряет обработку. Однако на самом деле вам не нужно удалять рабочее пространство / слой, так как он будет очищаться при закрытии приложения. Как уже упоминалось, запуск arcpy.Delete может быть полезен (иногда необходим), если вам не хватает оперативной памяти, потому что у вас слишком много вещей в рабочем пространстве in_memory.
RyanDalton
12
Там не так много всего. Есть волшебный каталог, к которому вы можете получить доступ в инструментах геообработки и дугообразных курсорах in_memory. Вы бы сделали что-то вроде arcpy.management.CreateTable('in_memory', 'my_new_table')или CreateFeatureClassсделать новый класс объектов или таблицу. Затем у вас есть новая таблица в этом процессе с путем in_memory\my_new_table, если вы находитесь в arcmap, она добавит табличное представление к названию таблицы, my_new_tableкоторое вы можете использовать в качестве ярлыка для доступа к ней. Если это временная таблица в памяти, просто используйте, arcpy.management.Delete(r'in_memory\my_new_table')когда закончите, в конце вашего скрипта.
Немного не по теме, но думаю стоит указать. Во-первых, я согласен с @JasonScheirer и @egdetti выше, что in_memoryможет быть очень полезно. Самое главное, что in_memoryрабочая область не поддерживает растровые данные. Если это станет проблемой, я бы порекомендовал использовать tempfileмодуль Python . Это будет не так быстро, но более надежно. Например, вы можете сделать что-то вроде:
У arcpy есть способ работать с растрами, встроенными с помощью метода arcpy.Raster (). Определяя переменную, такую как myRaster = arcpy.Raster ("C: \ RasteLocation"), вы создаете растровый объект в памяти, который можно легко использовать в вычислениях алгебры карты и различных других растровых операциях. Сохранение такого растрового объекта так же просто, как запись в myRaster.save ("C: \ SaveLocation"). Очень полезная особенность, которую arcpy приносит на стол.
блюфут
@egdetti Справедливый звонок. Мне любопытно знать, как он обрабатывает большие наборы данных, хотя.
om_henners
1
@mbenedetti - объект Raster записывает растр в рабочее пространство arcpy scratch - настолько поздно, насколько это возможно, что позволяет arcpy оптимизировать ввод-вывод путем объединения инструментов для обработки одной ячейки (например, "+") в один процесс выполнения , например. Метод save () заставит выполнить растровую обработку.
Кертис Прайс
3
@om_henners in_memory поддерживает растры в ArcGIS 10.1!
Кертис Прайс
2
@om_henners arcpy предоставляет инструмент для создания чистых имен, который имеет преимущества в том, что, например, к классу чистых пространственных объектов в папке автоматически добавляется «.shp». Метод arcpy.CreateScratchName ().
Там не так много всего. Есть волшебный каталог, к которому вы можете получить доступ в инструментах геообработки и дугообразных курсорах
in_memory
. Вы бы сделали что-то вродеarcpy.management.CreateTable('in_memory', 'my_new_table')
илиCreateFeatureClass
сделать новый класс объектов или таблицу. Затем у вас есть новая таблица в этом процессе с путемin_memory\my_new_table
, если вы находитесь в arcmap, она добавит табличное представление к названию таблицы,my_new_table
которое вы можете использовать в качестве ярлыка для доступа к ней. Если это временная таблица в памяти, просто используйте,arcpy.management.Delete(r'in_memory\my_new_table')
когда закончите, в конце вашего скрипта.источник
Немного не по теме, но думаю стоит указать. Во-первых, я согласен с @JasonScheirer и @egdetti выше, что
in_memory
может быть очень полезно. Самое главное, чтоin_memory
рабочая область не поддерживает растровые данные. Если это станет проблемой, я бы порекомендовал использоватьtempfile
модуль Python . Это будет не так быстро, но более надежно. Например, вы можете сделать что-то вроде:источник