ArcGIS“ in_memory”工作区的正确语法和用法是什么?


33

我不清楚如何最好地使用in_memoryArcGIS中的工作区。我找到的关于该主题的最佳资源来自ESRI的“ 使用内存中的工作空间”。不幸的是,帮助部分的信息不是很多。另外,此网站上有一篇帖子,简要介绍了此处此处的主题。

我的具体问题:

  • in_memory在基于ArcGIS / arcpy的脚本中使用工作区的正确用法和语法是什么?
  • in_memory工作区中的相同,例如,创建使用层arcpy.MakeFeatureLayer_management()
  • 是否有任何标准,例如in_memory在脚本末尾删除工作区?

Answers:


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")

希望能有所帮助。


3
我同意@egdetti。它非常有用,非常强大,并显着加快了处理速度。但是,实际上您不需要删除工作空间/层,因为在关闭应用程序时它将清理自身。如前所述,如果发现in_memory工作区中的内容过多,则运行arcpy.Delete可能会有所帮助(有时是必要的)。
RyanDalton 2012年

12

没有很多东西。您可以在地理处理工具和名为的arcpy游标中访问一个魔术目录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工作空间不支持栅格数据。如果这成为问题,我建议您使用Python tempfile模块。这不会那么快,但是更可靠。例如,您可以执行以下操作:

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带来了一个非常有用的功能。
bluefoot '10 -10-11

@egdetti公平电话。我很好奇,但是它如何处理更大的数据集。
om_henners 2012年

1
@mbenedetti-Raster对象尽可能早地将栅格写入arcpy临时工作区,这允许arcpy通过将单单元处理工具(例如“ +”之类的)堆叠到单个执行过程中来优化I / O。 , 例如。save()方法将强制执行栅格处理。
Curtis价格

3
@om_henners in_memory在ArcGIS 10.1中支持栅格!
Curtis价格

2
@om_henners arcpy提供了一个用于创建临时名称的工具,该工具的优点在于,例如,文件夹中的临时要素类会自动添加“ .shp”。该方法是arcpy.CreateScratchName()。
Curtis价格
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.