Каков правильный синтаксис и использование для рабочего пространства ArcGIS «in_memory»?

33

Мне неясно, как лучше использовать in_memoryрабочее пространство в ArcGIS. Лучший ресурс, который я нашел по этому вопросу, - это ESRI по использованию рабочей области в памяти . К сожалению, раздел справки не очень информативен. Также на этом сайте есть пост, который кратко затрагивает эту тему здесь и здесь .

Мои конкретные вопросы:

  • Как правильно использовать синтаксис для использования in_memoryрабочей области в скриптах на основе ArcGIS / arcpy?
  • Является ли in_memoryрабочая область такой же, как, например, создание слоя с использованием arcpy.MakeFeatureLayer_management()?
  • Существуют ли какие-либо стандарты, такие как удаление in_memoryрабочей области в конце скрипта?
Аарон
источник

Ответы:

41

Я использовал "in_memory" совсем недавно. Это может быть очень полезно, так как потенциально может значительно увеличить скорость обработки для определенных задач, однако, если вы работаете с очень большими наборами данных, это может привести к сбою вашей программы.

Вы можете использовать "in_memory" для определения выходных данных процесса ... часто, если я выполняю задачу в классе пространственных объектов, я сначала скопирую его в рабочую область "in_memory":

inFeature = r'C:\myDir.gdb\myFeature'
memoryFeature = "in_memory" + "\\" + "myMemoryFeature"
arcpy.CopyFeatures_management(inFeature, memoryFeature)

Обратите внимание, что вам не нужно объединять memoryFeature вместе, как я, вы можете записать это как «in_memory \ myMemoryFeature», мне просто нравится делать это таким образом, чтобы легко переключаться между «in_memory» и физическим каталогом. Затем вы можете выполнять процессы на вашей функции в памяти. Когда вы закончите, вы можете отменить процесс, чтобы сохранить его обратно в каталог.

Я могу ошибаться, но я считаю, что это не то же самое, что создание векторного слоя. Слои объектов дают вам доступ к методам выделения и другим специфическим для слоя операциям Думайте о каталоге "in_memory" как о векторном эквиваленте растровому объекту (raster = arcpy.Raster (myRasterLocation))

Для очистки после использования "in_memory" просто добавьте следующую строку кода:

arcpy.Delete_management("in_memory")

Надеюсь, это поможет.

bluefoot
источник
3
Я согласен с @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')когда закончите, в конце вашего скрипта.

Джейсон Шайрер
источник
9

Немного не по теме, но думаю стоит указать. Во-первых, я согласен с @JasonScheirer и @egdetti выше, что in_memoryможет быть очень полезно. Самое главное, что in_memoryрабочая область не поддерживает растровые данные. Если это станет проблемой, я бы порекомендовал использовать tempfileмодуль Python . Это будет не так быстро, но более надежно. Например, вы можете сделать что-то вроде:

import arcpy
import tempfile
import os.path
import shutil

try:
    temp_dir = tempfile.mkdtemp()
    temp_gdb = "temp.gdb"
    arcpy.CreateFileGDB_management(temp_dir, temp_gdb)
    arcpy.env.workspace = os.path.join(temp_dir, temp_gdb)

    #Some processing...

except Exception, e:
    #handle exceptions here
    print e
finally:
    shutil.rmtree(temp_dir, True)
om_henners
источник
2
У 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 ().
Кертис Прайс