ข้อผิดพลาดหลายขั้นตอน - การใช้งาน ArcGIS


13

ฉันสงสัยว่าคนอื่น ๆ ในชุมชนที่นี่พยายามใช้การประมวลผลหลายอย่างสำหรับการวิเคราะห์เชิงพื้นที่หรือไม่ คือฉันพยายามที่จะวนซ้ำผ่านชุด 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 สำหรับคำแนะนำการเริ่มต้นในการใช้พื้นที่ทำงานชั่วคราวที่แยกจากกัน - ยังคงงงงวยกับสาเหตุที่มันเดิมไม่ทำงาน

แหล่งข้อมูลเพิ่มเติม

บล็อกมัลติโพรเซสซิง ESRI

บล็อก Python, Gis และ Stuff


คำแนะนำนี้หยาบมากฉันไม่ต้องการทำเป็นระเบียบในการตอบกลับ แต่คุณคิดว่าใช้ ArcGIS ในเครื่องเสมือนหลายเครื่องพร้อมกันไหม? (คุณอาจต้องติดตั้งแยกต่างหากในแต่ละ VM แต่ละคนมีโครงสร้างไดเรกทอรีของตัวเอง.) อีกความคิดที่รุนแรงคือการฟาร์มออกบางส่วนของการประมวลผล: ยกตัวอย่างเช่น focalstats Rสามารถทำได้ใน คำแนะนำเหล่านี้ไม่ใช่คำแนะนำที่ดีสำหรับงานทั่วไปเนื่องจากอาจมีปัญหามากกว่าที่ควรค่า แต่เมื่อคุณสามารถประหยัดเวลาได้หลายครั้ง
whuber

คำตอบ:


7

การเชื่อมต่อ IWorkspace แต่ละรายการ (เช่นการเชื่อมต่อฐานข้อมูลแต่ละรายการ) มีความเกี่ยวข้องของเธรด สองเธรดไม่สามารถแชร์เวิร์กสเปซเดียวกันได้ คุณสามารถมีหนึ่งเธรดที่เป็นเจ้าของทรัพยากรและจากนั้นซิงค์การเข้าถึง แต่ถ้าคุณกำลังจะใช้ฟังก์ชัน gp แบบตรงนั่นหมายความว่าไม่ใช่ตัวเลือก

วิธีที่ง่ายที่สุด (อ่อนแอ) คือการสร้างกระบวนการแยกต่างหากจากนั้นทำการซิงค์หลายกระบวนการ แม้แล้วคุณควรทราบประเภทพื้นที่ทำงานพื้นฐาน หากคุณไม่ได้ใช้ arcsde (แหล่งข้อมูลหลายผู้ใช้) คุณอาจจะใช้แหล่งข้อมูลผู้ใช้เดียว (เช่นส่วนบุคคลหรือ filegdb) จากนั้นจำไว้ว่าหมายถึงกระบวนการเดียวเท่านั้นที่สามารถเขียนได้ในแต่ละครั้ง! การซิงโครไนซ์ (อ่อนแอ) โดยทั่วไปสำหรับสถานการณ์เหล่านี้คือแต่ละกระบวนการแบบขนานเขียนไปยังพื้นที่ทำงานชั่วคราวที่แตกต่างกันและจากนั้นคุณรวมมันทั้งหมดในพื้นที่ทำงานปลายทางของคุณในกระบวนการเดียว


คำแนะนำที่ดี ... ที่จริงแล้วแม้ว่าฉันจะไม่ได้เพิ่มลงในโพสต์นี้ฉันกำลังสร้างโฟลเดอร์ใหม่โดยใช้ชื่อภาพแรสเตอร์และการตั้งค่าพื้นที่ทำงานสำหรับแต่ละกระบวนการในไดเรกทอรีเฉพาะนั้น นี่คือไดเรกทอรีไฟล์แยกสำหรับแต่ละภาพแรสเตอร์และไม่แยกฐานข้อมูลภูมิศาสตร์ (ฉันจำเป็นต้องใช้หรือไม่) ฉันวางแผนแล้วว่าจะใช้ฟังก์ชั่น os.walk ง่าย ๆ เพื่อค้นหาไฟล์ทั้งหมดที่ฉันต้องการย้ายมันไปยังฐานข้อมูลไฟล์ที่ฉันต้องการ
BJEBN

คุณเป็นเพียงการปฏิบัติการแรสเตอร์? มีเธรดหรือกระบวนการอ่าน / เขียนไปยังฐานข้อมูลภูมิศาสตร์เดียวกันในเวลาเดียวกันหรือไม่?
Ragi Yaser Burhum

สวัสดีขอโทษฉันอาจไม่ชัดเจนกับคำสั่งก่อนหน้า การดำเนินการแบบแรสเตอร์เท่านั้น (reproject, focalstats, จัดประเภทใหม่ ฯลฯ ... ) และขั้นตอนการประมวลผลทางภูมิศาสตร์เหล่านั้นทั้งหมดจะทำตามลำดับ (หรือจำเป็นต้องมี) สำหรับภาพแรสเตอร์แต่ละภาพ ภาพแรสเตอร์เหล่านี้จะถูกบันทึกไว้ในพื้นที่ทำงานของโฟลเดอร์ที่ไม่ซ้ำกัน rasters ดั้งเดิมทั้งหมดกำลังอ่านจากไดเรกทอรีเดียวกัน (ไม่ใช่ภาพเดียวกัน) ตามที่สร้างงานของบุคคลที่จะส่ง
BJEBN

หลังจากคิดใหม่อีกครั้งฉันพยายามระบุพื้นที่ทำงานรอยขีดข่วนโดยเฉพาะเช่นกันสำหรับแต่ละภาพ DEM กำลังฉายอย่างถูกต้องอย่างไรก็ตามสิ่งนี้ทำให้เกิดข้อผิดพลาดใหม่ในระยะโฟกัส - "ไม่รองรับประเภท <Raster>" ฉันพยายามระบุที่อยู่ไดเรกทอรีทั้งหมด แต่ไม่มีโชค ฉันโหลดแรสเตอร์ที่คาดการณ์ไว้ใน arcgis โดยไม่มีปัญหา
BJEBN

นั่นหมายความว่าคุณกำลังก้าวไปข้างหน้า สำหรับ focalstats มันขึ้นอยู่กับวิธีการนำไปใช้ภายใน หากเป็นการใช้งานใหม่อาจใช้พื้นที่ทำงานเป็นศูนย์ (เช่นฐานข้อมูล Geod) อย่างไรก็ตามหากเป็นหนึ่งในฟังก์ชั่นที่ยังไม่ได้อัปเกรด (!?!?!) พื้นที่ทำงานที่อนุญาตอาจเป็นโฟลเดอร์ได้เท่านั้น สำหรับฟังก์ชั่น GP นั้นให้ระบุเฉพาะโฟลเดอร์ (เก็บ scratchworkspace สำหรับส่วนที่เหลือ) และดูว่าเกิดอะไรขึ้น
Ragi Yaser Burhum

5

คุณมีหลายเธรดที่แย่งชิงทรัพยากรเดียวกัน

ลองย้ายคำสั่ง 'import arcpy' ของคุณไปยังเป้าหมายของการประมวลผลหลายตัว คุณจะมั่นใจได้ว่า arcpy ทำงานกับตัวแปรสภาพแวดล้อมและหน่วยความจำของตัวเอง

มันฟังดูไร้สาระ แต่ถึงแม้ว่าคุณกำลังตั้งค่าตัวแปรสภาพแวดล้อมในวิธีเป้าหมาย Multiprocess, python ยังคงใช้พื้นที่หน่วยความจำที่ใช้ร่วมกันเพื่อจัดการโมดูล arcpy และดังนั้นตัวแปรใด ๆ ที่คุณตั้งค่า

Arcpy ไม่ปลอดภัยสำหรับเธรด มันตั้งใจเสมอที่จะใช้ภายในกระบวนการเดียว แต่มีวิธีแก้ปัญหา


ข้อเสนอแนะของฉันคือการนำเข้า arcpy ภายในเป้าหมายสำหรับกระบวนการใหม่

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

สวัสดีขอบคุณสำหรับคำแนะนำของคุณ ... แม้ว่าฉันจะยังคงมีปัญหา เมื่อคุณอ้างถึง 'นำเข้า arcpy เข้าสู่เป้าหมายของการประมวลผลหลายตัว' คุณหมายถึงคำสั่ง if__name ... หรือจริง ๆ ในฟังก์ชัน def ฉันคิดว่าการนำเข้าฟังก์ชั่น def ไม่ถูกต้อง
BJEBN
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.