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

我的具体问题:


在基于ArcGIS / arcpy的脚本中使用in_memory工作区的正确用法和语法是什么?
in_memory工作区是否与例如使用arcpy.MakeFeatureLayer_management()创建层相同?
是否存在诸如在脚本末尾删除in_memory工作区之类的标准? />

#1 楼

我最近一直在使用“ 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”后进行清理,只需添加以下代码: br />
arcpy.Delete_management("in_memory")


希望有帮助。

评论


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

– RyanKDalton
2012年10月10日在22:02



#2 楼

没有很多东西。您可以在地理处理工具和名为in_memory的arcpy游标中访问一个魔术目录。您可以执行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')

#3 楼

稍微偏离主题,但我认为值得指出。首先,我同意上面的@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)
 


评论


arcpy有一种方法可以处理用arcpy.Raster()方法内置的栅格。通过定义诸如myRaster = arcpy.Raster(“ C:\ RasteLocation”)的变量,您可以在内存中创建一个栅格对象,该对象可以轻松用于地图代数计算和各种其他栅格操作。保存这样的栅格对象就像在myRaster.save(“ C:\ SaveLocation”)中编写一样简单。 arcpy带来了一个非常有用的功能。

– bluefoot
2012年10月11日,0:24

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

–om_henners
2012年10月11日,0:56

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

–科蒂斯价格
13年4月2日,0:46

@om_henners in_memory支持ArcGIS 10.1中的栅格!

–科蒂斯价格
13年4月2日,0:47

@om_henners arcpy提供了一个用于创建临时名称的工具,该工具的优点在于,例如,文件夹中的临时要素类会自动添加“ .shp”。该方法是arcpy.CreateScratchName()。

–科蒂斯价格
13年4月2日,0:48