我想知道这里的社区中是否有人尝试使用多重处理进行空间分析。也就是说,我试图遍历一系列栅格,为每个栅格创建一个多处理作业,并通过一个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提出的使用单独的临时工作区的初步建议-仍然对其最初无法工作的原因感到困惑。
其他资源
R
。这些不是一般用途工作的好建议,因为它们可能比他们值得的麻烦更多,但是如果您一次可以节省几个小时,那么努力可以得到回报。