Який правильний синтаксис та використання для робочої області 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)

Зауважте, що вам не потрібно об'єднувати пам'ять пам'яті разом, як я, ви можете записати це як "in_memory \ myMemoryFeature", мені просто подобається робити це таким чином, щоб легко переходити назад і назад між "in_memory" та фізичним каталогом. Потім ви можете виконувати процеси на своїй функції в пам'яті. Коли ви закінчите, ви можете змінити процес, щоб зберегти його назад у каталог.

Я можу помилитися, але я вважаю, що це не те саме, що створити функціональний шар. Характеристичні шари надають вам доступ до методів вибору та інших операцій, що стосуються конкретного рівня. Подумайте про каталог "in_memory" як вектор, еквівалентний растровому об'єкту (raster = arcpy.Raster (myRasterLocation))

Для очищення після використання "in_memory" просто додайте наступний рядок коду:

arcpy.Delete_management("in_memory")

Сподіваюся, що це допомагає.


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)

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 ().
Кертіс Ціна
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.