ここのコミュニティの他の誰かが空間分析にマルチプロセッシングを使用しようとしたのではないかと思っていました。つまり、一連のラスターを反復処理し、それぞれに対してマルチプロセッシングジョブを作成し、1つの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の場所に)作成された奇妙なフォルダーに注目してください。
私の質問は、1つのマルチプロセッシング機能内で複数のステップのジオプロセシングを作成することは不可能ですか?または、これらのステップを個々のジオプロセシングステップにタイル化する必要がありますか?
更新
まだ同様のエラーを引き起こしている-インポート関数をdef関数に移動すると、
import arcpy
from arcpy.sa import *
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
次に、メイン関数で特定の一時ディレクトリを作成し、各マルチプロセッシングタスクに一意の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
。これらは価値のあるものよりも面倒な場合があるため、これらは汎用作業には適していませんが、一度に何時間も節約できる場合、努力は報われる可能性があります。