多重处理错误-ArcGIS实施


13

我想知道这里的社区中是否有人尝试使用多重处理进行空间分析。也就是说,我试图遍历一系列栅格,为每个栅格创建一个多处理作业,并通过一个def函数中的多个地理处理步骤运行它们。遵循以下原则

def net(RasterImage, OutFolderDir):
    arcpy.env.overwriteOutput = True  
    arcpy.env.workspace = OutFolderDir 
    DEM_Prj = DEM_Prj.tif

    try:
        arcpy.ProjectRaster_management(RasterImage, DEM_Prj....
        FocalStatistics(DEM_prj....)
        ...

if __name__ == '__main__':  
    InputFolder = r'C:\test\somepath'  
    Output = r'C:\test\somepath2'  
    arcpy.env.workspace = InputFolder  
    arcpy.env.scratchWorkspace = r'C:\test.gdb'    

    fcs = arcpy.ListRasters('*')
    pool = multiprocessing.Pool(4)   
    jobs = []                 
    for fc in fcs:
        rIn = os.path.join(InputFolder,fc)
        rOut = os.path.join(Output,fc[:-4])
        jobs.append(pool.apply_async(net,(rIn, rOut)))    

现在,多处理确实可以运行,通常是针对第一批!但是,在尝试多个数据集(超过4个文件-即4个核心多重处理)时,我总是遇到几种不同的错误,包括:

ERROR 010302: Unable to create the output raster: C:\somepath\sr6f8~1\FocalSt_srtm1
ERROR 010067: Error in executing grid expression.
Failed to execute (FocalStatistics).

ERROR 999999: Error executing function.
Failed to copy raster dataset
Failed to execute (ProjectRaster)

请注意,在第一个错误中,与焦点统计信息关联的(在OutFolderDir位置中)创建的奇怪文件夹几乎创建了最终输出的精确副本。

我的问题是基于您的经验,是否不可能在一个多处理功能中创建多步地理处理?还是我需要将这些步骤平铺到各自的地理处理步骤中?

更新

仍然令人难以接受的错误-将导入功能移至def功能表明

import arcpy 
from arcpy.sa import *

无法创建带有添加的语法警告的输出,该警告警告不允许导入*。

更新#2

我知道这是一个较晚的答复,但我认为这可能会使其他人受益,以便将来参考我的允许多处理与arcpy一起使用的解决方法。回到此问题后,我发现的主要问题不是arcpy模块的竞争,而是ArcObjects用于保存临时文件的scratchWorkspace的竞争。因此,考虑在多处理解析参数中运行一个计数器,以为每个进程创建一个唯一的scratchWorkspace,即

Counter = 0 
for fc in fcs:              
    rIn = os.path.join(InputFolder,fc)              
    rOut = os.path.join(Output,fc[:-4])                    
    jobs.append(pool.apply_async(net,(rIn, rOut,Counter)))            
    Counter += 1

然后在main函数中创建一个特定的临时目录,并为每个多处理任务分配一个唯一的scratchWorkspace。

def main(RasterImage,OutFolderDir,Counter)      
    TempFolder = os.path.join(os.path.dirname(OutFolderDir),'Temp_%s'%  (Counter))      
    os.mkdir(TempFolder)      
    arcpy.scratchWorkspace = TempFolder      
    ... 

希望能有所帮助,并感谢Ragi提出的使用单独的临时工作区的初步建议-仍然对其最初无法工作的原因感到困惑。

其他资源

ESRI多处理博客

Python,Gis和Stuff博客


这个建议太粗糙了,我不想在答复中将其形式化,但是您是否考虑过同时在多个虚拟机中运行ArcGIS?(您可能需要在每个VM中单独安装,每个VM都有自己的目录结构。)另一个激进的想法是,要进行一些处理:例如,focusstats可以在中完成R。这些不是一般用途工作的好建议,因为它们可能比他们值得的麻烦更多,但是如果您一次可以节省几个小时,那么努力可以得到回报。
whuber

Answers:


7

每个IWorkspace连接(即每个数据库连接)都具有线程相似性。两个线程不能共享同一工作空间。您可以让一个线程拥有资源,然后同步访问,但是如果您要使用直接gp函数,那么这甚至不是一种选择。

最简单的方法是创建单独的进程,然后进行多进程同步(与多线程同步相反)。即使这样,您也应该知道基础工作空间类型。如果您不使用arcsde(多用户数据源),则可能会使用单个用户数据源(例如personal或filegdb)。然后记住,这意味着一次只能写入一个进程!这些方案的典型(帧)同步是每个并行进程写入一个不同的临时工作空间,然后将它们全部合并到单个进程中。


好的建议...实际上,尽管我没有将其添加到这篇文章中,但是我正在基于栅格图像名称创建一个新文件夹,并将每个进程的工作区设置为该特定目录。这些是每个栅格图像的单独文件目录,而不是单独的地理数据库(我需要吗?)。然后,我计划使用一个简单的os.walk函数来查找我需要的所有那些文件,然后将它们移至所需的文件地理数据库。
BJEBN 2011年

您仅在进行栅格操作吗?是否有任何线程或进程同时读取/写入同一地理数据库?
拉吉·亚瑟·伯姆

嗨,对不起,我对先前的声明可能不太清楚。对于每个栅格图像,仅栅格操作(重新投影,焦点统计,重新分类等)和所有这些地理处理步骤都是按顺序(或需要这样做)完成的。这些栅格图像将保存到唯一的文件夹工作区中。所有原始栅格都从同一目录(尽管不是同一张图像)读取,因为这将创建要发送的个人作业。
BJEBN 2011年

经过重新考虑后,我尝试为每个图像指定一个特定的临时工作区。正确投影了DEM,但是这在调焦器阶段产生了一个新错误-“不支持<Raster>类型”。我试图指定整个目录地址,但是没有运气。我已将投影栅格毫无问题地加载到了arcgis中。
BJEBN 2011年

好吧,这意味着您正在前进。对于调焦器,这取决于其内部实现方式。如果是新的实现,则可能需要暂存工作区(即地理数据库)。但是,如果它是尚未升级的功能之一(!?!?!),则它允许的工作空间可能只是一个文件夹。对于该特定的GP功能,仅指定一个文件夹(其余部分保留草稿工作区),然后看看会发生什么。
拉吉·亚瑟·伯姆

5

您有多个线程争用同一资源。

尝试将“ import arcpy”语句移至多处理目标。您将确保arcpy正在使用它自己的一组环境变量和内存。

这听起来很荒谬,但是即使您在“多进程”目标方法中设置环境变量,python仍在使用共享内存空间来管理arcpy模块以及因此来设置的所有变量。

Arcpy不是线程安全的。它总是打算在单个过程中使用。但是有解决方法。


我的建议是在目标中导入arcpy以进行新流程。

def _multiprocessing_target(args):
    import arcpy
    ...code

嗨,谢谢您的建议...尽管我似乎仍然有问题。当您提到“将arcpy导入到多处理的目标中”时,是否暗示在if__name ...语句下或实际上在def函数中。正如我以为,在def函数中导入是无效的。
BJEBN 2011年
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.