أكثر

Arcpy مع رميات معالجة متعددة "خطأ غير قابل للاختراق: لا يمكن التقاط الكائنات"

Arcpy مع رميات معالجة متعددة


أحاول تسريع العملية التي تعمل حاليًا بشكل متزامن ، باستخدام وحدة المعالجة المتعددة بيثون.

أواجه مشكلة في إرسال طبقة معالم إلى وظيفة تسمى بالمعالجة المتعددة ، كما هو موضح في هذا البرنامج النصي البسيط:

استيراد معالجة متعددة ، arcpy def doProcess (lyr): print (lyr.name) if __name__ == '__main__': # إنشاء مصفوفة من طبقات المعالم arcpy.env.workspace = "C:  Program Files (x86)  ArcGIS  Desktop10 .2  TemplateData  TemplateData.gdb "featureLayers = [] fcs = arcpy.ListFeatureClasses (" * "،" All "،" World ") لـ fc في fcs: arcpy.Delete_management (fc +" _lyr ") lyrName = fc + "_lyr" arcpy.MakeFeatureLayer_management (fc، lyrName) featureLayers.append (arcpy.mapping.Layer (lyrName)) #This يعمل عند عدم استخدام المعالجة المتعددة: لـ featureLayer in featureLayers: doProcess (featureLayer) #This fails with "UnpickleableError: Cannot pickleRror:  كائنات "pool = multiprocessing.Pool () pool.map (doProcess، featureLayers) pool.close () pool.join ()

عند التكرار عبر المصفوفة يدويًا ، بدلاً من استخدام المعالجة المتعددة ، فإن الوظيفة لها حق الوصول إلى طبقة المعالم. ولكن عند استخدام المعالجة المتعددة ، تظهر رسالة الخطأ هذه:

UnpickleableError: لا يمكن اختيار نوع الكائنات "معالجة جغرافية لكائن طبقة"

ما هي الصيغة / النهج الصحيح للتعامل مع طبقة المعالم داخل بيئة المعالجة المتعددة؟ لقد أسست النص أعلاه على المثال في مدونة Esri للمعالجة المتعددة باستخدام ArcGIS


لقد وجدت أخيرًا الوقت للنظر في هذا. لا أفهم تمامًا رسالة الخطأ "غير القابلة للانتقاء" ، ولكن الحل البديل هو تمرير السلاسل فقط إلى المعالجات المتعددة. شيء من هذا القبيل:

استيراد العمليات المتعددة ، arcpy ، os def doProcess (fClass): # هذه الوظيفة لا تفعل شيئًا ، إنها فقط لإظهار أن الوصول إلى طرق Arcpy هو ممكن طباعة ("in do process function for" + fClass) arcpy.env.workspace = " C:  Program Files (x86)  ArcGIS  Desktop10.2  TemplateData  TemplateData.gdb "arcpy.Delete_management (fClass +" _lyr ") lyrName = fClass +" _lyr "arcpy.MakeFeatureLayer_management (fClass، lyrName) desc = arcpy. صِف (lyrName) print ("Finished" + desc.Name) إذا __name__ == '__main__': # إنشاء مصفوفة من أسماء فئات الميزة arcpy.env.workspace = "C:  Program Files (x86)  ArcGIS  Desktop10. 2  TemplateData  TemplateData.gdb "fClasses = [] fcs = arcpy.ListFeatureClasses (" * "،" All "،" World ") لـ fc في fcs: fClasses.append (fc) #Multiprocessing نهج pool = multiprocessing.Pool ( ) pool.map (doProcess، fClasses) pool.close () pool.join ()

(من المثير للاهتمام أن هذا البرنامج النصي يستغرق وقتًا أطول لإكماله عندما أستخدم نهج المعالجة المتعددة ، مقارنةً بالتشغيل فقط:

لـ fClass في fClasses: doProcess (fClass)

من المفترض أن يكون هناك الكثير من النفقات العامة في إعداد البيئات لكل مؤشر ترابط. نأمل في سيناريو أكثر تعقيدًا يتضمن مهام معالجة جغرافية طويلة ، أن يكون المردود أسرع في إكمال جميع المهام بشكل عام.)


شاهد الفيديو: ArcPy: Beyond the Basics of