ฉันสงสัยว่าคนอื่น ๆ ในชุมชนที่นี่พยายามใช้การประมวลผลหลายอย่างสำหรับการวิเคราะห์เชิงพื้นที่หรือไม่ คือฉันพยายามที่จะวนซ้ำผ่านชุด rasters สร้างงานหลายตัวประมวลผลสำหรับแต่ละและรันพวกเขาผ่านขั้นตอนการประมวลผลทางภูมิศาสตร์จำนวนมากภายในฟังก์ชัน 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) ที่เกี่ยวข้องกับสถิติโฟกัสที่เกือบจะสร้างแบบจำลองที่แน่นอนของผลลัพธ์สุดท้าย
คำถามของฉันเป็นไปตามประสบการณ์ของคุณเป็นไปไม่ได้ที่จะสร้างกระบวนการทางภูมิศาสตร์หลายขั้นตอนในฟังก์ชั่นมัลติโพรเซสเซอร์? หรือฉันต้องปูกระเบื้องขั้นตอนเหล่านี้ให้เป็นขั้นตอนการประมวลผลทางภูมิศาสตร์แต่ละรายการหรือไม่
UPDATE
ยังคงเข้ารหัสข้อผิดพลาดที่คล้ายกัน - การย้ายฟังก์ชั่นการนำเข้าไปยังฟังก์ชั่น def แสดงให้เห็นว่า
import arcpy
from arcpy.sa import *
ไม่สามารถสร้างเอาต์พุตด้วยคำเตือนไวยากรณ์เพิ่มเติมที่ไม่อนุญาตให้นำเข้า *
อัปเดต # 2
ฉันรู้ว่านี่เป็นคำตอบที่ล่าช้า แต่ฉันคิดว่ามันอาจเป็นประโยชน์ต่อคนอื่นสำหรับการอ้างอิงในอนาคตเกี่ยวกับวิธีแก้ปัญหาของฉันที่ช่วยให้การประมวลผลแบบมัลติโพรเซสเซอร์สามารถทำงานกับอาร์คปีได้ ปัญหาหลักที่ฉันพบหลังจากกลับมาที่ปัญหานี้ไม่ใช่การแข่งขันของโมดูล arcpy แต่เป็นการแข่งขันเหนือ scratchWorkspace ที่ ArcObjects ใช้เพื่อบันทึกไฟล์ชั่วคราว ดังนั้นให้พิจารณาการเรียกใช้ตัวนับเข้าไปในอาร์กิวเมนต์การประมวลผลหลายตัวประมวลผลเพื่อสร้าง 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
สามารถทำได้ใน คำแนะนำเหล่านี้ไม่ใช่คำแนะนำที่ดีสำหรับงานทั่วไปเนื่องจากอาจมีปัญหามากกว่าที่ควรค่า แต่เมื่อคุณสามารถประหยัดเวลาได้หลายครั้ง