أكثر

هل يمكن تشغيل المعالجة المتعددة باستخدام Arcpy في أداة البرنامج النصي؟


لقد كنت أتلاعب بوحدة المعالجة المتعددة لحل بعض معالجة البيانات في ArcMap 10.3.

لقد قمت بإنشاء برنامج نصي يعمل بشكل جيد إذا قمت بتشغيله في IDLE. أرى جميع النوى الخاصة بي بحد أقصى في إدارة المهام ويكتمل الرمز دون أخطاء.

الآن إذا قمت بتوصيل هذا البرنامج النصي كأداة Script Tool في ArcToolbox ، فسيظهر خطأ غريب

تعذر العثور على الملف: من multirocessing.forking import main؛ رئيسي (). mxd

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

لذا فإن سؤالي هو ببساطة هل يمكن للمرء إنشاء برنامج نصي يستخدم وحدة المعالجة المتعددة وتشغيله من ArcToolbox؟ من اللعب المحدود الخاص بي ، يبدو أنني لا أستطيع ، وهي تقنية لا يمكن تشغيلها إلا من IDLE؟


لقد نجحت أخيرًا في العمل ، باستخدام كل مساعدة. قررت توثيق المثال البسيط الخاص بي بشكل كامل وجمع أي من الرحلات التي كان عليّ التغلب عليها في مستند على موقع ESRI GeoNet. مثل إجابة Luke ، آمل أن يوفر هذا نقطة انطلاق لأي شخص يحاول إنشاء أداة نصية للغة الثعبان تستخدم المعالجة المتعددة. الوثيقة بعنوان إنشاء أداة نصية تستخدم المعالجة المتعددة.


نعم ، يمكنك تشغيل عمليات فرعية متعددة المعالجات من برنامج نصي لمربع الأدوات. يوجد أدناه بعض التعليمات البرمجية للعرض في Python Toolbox (* .pyt).

هناك عدد من "مسكتك". سيتم تطبيق بعض (وليس كل) على أدوات Python النصية في مربع أدوات ثنائي (* .tbx) ، لكنني فقط أستخدم Python Toolboxes هذه الأيام لذلك لم أختبر.

بعض "مسكنا" / نصائح:

  • تأكد من أن كل عملية فرعية لها مساحة عمل خاصة بها (خاصة إذا كنت تستخدم محلل مكاني أو أدوات تغطية) للملفات المؤقتة واستخدم فقط العملية الرئيسية لتخصيص العمل وجمع النتائج وكتابة النتائج النهائية. هذا يعني أن أي كتابة إلى مجموعة بيانات نهائية تتم من خلال عملية واحدة لتجنب أي قفل أو تعارض ؛
  • قم بتمرير الكائنات القابلة للاختيار فقط ، مثل السلاسل والقوائم والأرقام ؛
  • يجب أن تكون أي وظائف تريد تشغيلها كعملية فرعية في وحدة نمطية قابلة للاستيراد (باسم ملف مختلف لـ .pyt) ، وليس ملف .pyt نفسه. وإلا ستحصل علىخطأ في التخليل: لا يمكن المخلل : فشل البحث عن السمة __builtin __;
  • تأكد من أن الكود الذي ينفذ المعالجة المتعددة موجود في وحدة نمطية قابلة للاستيراد (باسم ملف مختلف لـ .pyt) ، وليس ملف .pyt نفسه. وإلا ستحصل علىAssertionError: main_name ليس في sys.modules ، main_name

ينطبق على*.السنة التحضيريةنصوص في صندوق أدوات ثنائي (* .tbx):

  • تأكد من أن الكود الذي يوزع معلمات البرنامج النصي محمي بواسطة ملفإذا __name__ == '__main__':منع.
  • يمكنك الاحتفاظ بالوظائف التي تريد استدعاؤها في البرنامج النصي .py ، لكنك تحتاج إلى استيراد البرنامج النصي إلى نفسه.

رمز المثال

مربع أدوات بايثون

# test_multiprocessing.pyt استيراد نظام التشغيل ، النظام استيراد العمليات المتعددة import arcpy # أي وظائف تريد تشغيلها كعملية فرعية يجب أن تكون في # وحدة قابلة للاستيراد. A * .pyt غير قابل للاستيراد بواسطة python # وإلا ستحصل على # PicklingError: Can't pickle : بحث السمة __builtin __. فشلت الوظيفة # تأكد أيضًا من أن الكود الذي _ يفعل_ المعالجة المتعددة في وحدة نمطية قابلة للاستيراد # وإلا ستحصل على # AssertionError: main_name ليس في sys.modules ، main_name من test_multiprocessing_functions import تنفيذ فئة Toolbox (كائن): def __init __ (self): "تحديد خصائص مربع الأدوات (اسم مربع الأدوات هو اسم ملف .pyt)." self.label = 'Test Multiprocessing' self.alias = 'multiprocessing' # قائمة فئات الأدوات المرتبطة بصندوق الأدوات self.tools = [ TestTool] class TestTool (كائن): def __init __ (self): self.label = 'Test Multiprocessing' self.description = 'Test Multiprocessing Tool' self.canRunInBackground = True self.showCommandWindow = False def isLicensed (self): return True def updateParameters (self، parameters): إرجاع def updateMessages (self، parameters): إرجاع def getParameterInfo (self): "تعاريف المعلمات لـ GUI" إرجاع [arcpy.Parameter (displayName = 'Input Rasters'، name = "in_rasters"، نوع البيانات = "DERasterDataset" ، معلمة T. ype = "Required"، direction = "Input"، multiValue = True)] تنفيذ def (self ، parameters ، messages): # تأكد من أن الكود الذي _ يفعل_ المعالجة المتعددة في وحدة نمطية قابلة للاستيراد ، وليس .pyt # وإلا أنت ' ll get # AssertionError: main_name ليس في sys.modules ، main_name rasters = المعلمات [0] .valueAsText.split ('؛') للنقطية في البيانات النقطية: messages.addMessage (النقطية) تنفيذ (* نقطية)

وحدة Python القابلة للاستيراد (يمكن استخدامها أيضًا كأداة نصية في صندوق أدوات ثنائي (.tbx)

# test_multiprocessing_functions.py # - التشغيل دائمًا في المقدمة - غير محدد # - تشغيل نص Python قيد المعالجة - فحص استيراد نظام التشغيل ، sys ، ملف tempfile استيراد متعدد المعالجات استيراد arcpy من arcpy.sa import * def execute (* rasters): لـ raster in rasters: arcpy .AddMessage (النقطية) #Set multrocessing exe في حال كنا نعمل كعملية مضمنة ، على سبيل المثال ، يستخدم ArcGIS #get_install_path () استعلام التسجيل لمعرفة 64 بت python exe إذا كان متاحًا multrocessing.set_executable (os.path.join (get_install_path ((get_install_path ( ) ، 'pythonw.exe')) # قم بإنشاء مجموعة من العمال ، واحتفظ بوحدة معالجة مركزية واحدة مجانًا لتصفح الشبكة. # اسمح لكل عامل بمعالجة 10 مهام فقط قبل إعادة التشغيل (في حالة تسرب الذاكرة السيئ) التجمع = المعالجة المتعددة. Pool (العمليات = multiprocessing.cpu_count () - 1، maxtasksperchild = 10) # أبسط المعالجة المتعددة هي تعيين عنصر متكرر (أي. قائمة بالأشياء المراد معالجتها) إلى دالة # لكن هذا لا يسمح لك بمعالجة الاستثناءات في عملية واحدة ## output_rasters = pool.map (worker_function، rasters) # استخدم application_async بدلاً من ذلك حتى نتمكن من التعامل مع الاستثناءات بأمان المهام = { } بالنسبة إلى البيانات النقطية في البيانات النقطية: المهام [النقطية] = pool.apply_async (دالة_العمال ، [نقطية]) يتم تمرير # args كقائمة للخطوط النقطية ، ينتج عنها jobs.iteritems (): try: result = result.get () arcpy. AddMessage (نتيجة) باستثناء استثناء كـ e: arcpy.AddWarning ('{}  n {}'. تنسيق (نقطية ، repr (e))) pool.close () pool.join () def get_install_path (): "إرجاع 64 بت مسار تثبيت python من التسجيل (إذا تم تثبيته وتسجيله) ، وإلا ارجع إلى مسار تثبيت عملية 32 بت الحالي. "إذا كان sys.maxsize> 2 ** 32: إرجاع sys.exec_prefix # نحن يعمل في عملية 64 بت # نحن 32 بت لذا انظر إذا كان هناك مسار تثبيت 64 بت = r'SOFTWARE  Python  PythonCore  2.7 'من _ winreg import OpenKey ، QueryValue من _winreg import HKEY_LOCAL_MACHINE ، KEY_READ ، KEY_Wow64_64KEY حاول: مع OpenKey (HKEY_LOCAL_MACHINE ، المسار ، 0 ، KEY_READ | KEY_WOW64_64KEY) كمفتاح: إرجاع QueryValue (مفتاح ، "InstallPath"). strip (os.sep) # لدينا تثبيت 64 بت ، لذا أعد ذلك. باستثناء: إرجاع sys.exec_prefix # No 64bit ، لذا قم بإرجاع 32bit path def worker_function (in_raster): "تأكد من تمرير مسار الملف إلى البيانات النقطية ، وليس كائن arcpy.sa.Raster" ## مثال "عمل حقيقي" (لم يتم اختباره) ## اصنع مساحة عمل خدش فريدة #scratch = tempfile.mkdtemp () #out_raster = os.path.join (scratch، os.path.basename (in_raster)) # arcpy.env.workspace = scratch # arcpy.env.scratchWorkspace = scratch #ras = Raster (in_raster) #result = Con (IsNull (ras)، FocalStatistics (ras)، ras) # result.save (out_raster) #del ras ، النتيجة #return out_raster # اترك البرنامج النصي لتنظيف tempdir. # يمكن أيضًا تمرير out_raster كحجة ، # ولكن عليك التأكد من عدم وجود عمليات فرعية أخرى # تقوم بكتابة هذا الدليل عندما تكون العملية الفرعية الحالية ... # قم ببعض وقت استيراد العمل "الوهمي" ، وقت عشوائي. النوم ( random.randint (0،20) /10.0) #sleep for a bit لمحاكاة إرجاع العمل في_raster [:: - 1] #Return نسخة معكوسة لما تم تمريره إذا __name __ == '__ main__': # استيراد النص الحالي إلى تجنب: # PicklingError : لا يمكن المخلل : بحث السمة __builtin __. فشلت الوظيفة في الاستيراد test_multiprocessing_functions rasters = arcpy.GetParameterAsText (0) .split ('؛') للنقطية في البيانات النقطية: arcpy.AddMessage (النقطية) test_multiprocessing_functions.execute (* نقطية)

تجمع من قضايا المعالجة المتعددة

أحاول استخدام البركة من المعالجة المتعددة لتسريع بعض عمليات عامل التعريف (د) التي تحدث مرة واحدة لكل عامل في mxd. من الصعب ترميز هذا على D: TEMP Untitled4.mxd. يتم تشغيله ولكن واحدًا فقط في كل مرة. أستطيع أن أراه يبدأ في البركة ، ولكن فقط في قيد الاستخدام. أي مساعدة ستكون رائعة. أنا أقوم بتشغيله في مربع arctool في ArcMap وقمت بتشغيله كعملية غير محددة. كما قلت إنه يعمل ، ولكن واحدًا فقط في كل مرة.

استيراد آركبي
استيراد نظام التشغيل
استيراد المعالجة المتعددة

عامل def (د):
# طبقة عازلة بالقيم أدناه
bfs = [101 ، 200 ، 201 ، 400 ، 401 ، 750 ، 751 ، 1001 ،
1500, 1501, 2000, 2001, 2500]
لـ bf في bfs:
الإخراج = os.path.basename (د) [: - 4] + "_Buffer" + str (bf) + ".shp"
طباعة "Buffering" + d + "عند" + str (bf) + "Feet"
إذا كان القوس موجودًا (د):
arcpy.Buffer_analysis (d، "D: Temp " + Output، str (bf) + "Feet")
arcpy.Project_management ("D: Temp " + Output ، "D: Temp Test " + Output ، "C: Program Files (x86) ArcGIS Desktop10.0 Coordinate Systems نظم الإحداثيات الجغرافية أمريكا الشمالية NAD 1983.prj ")
arcpy.Delete_management ("D: Temp " + Output)
آخر:
طباعة "لا توجد بيانات"


إذا __name__ == '__main__':

# مجموعات MXD
mxd = arcpy.mapping.MapDocument ("D: TEMP Untitled4.mxd")
#mxd = arcpy.mapping.MapDocument ("CURRENT")

# اضبط بعض البيئات اللازمة للحصول على المخرجات الصحيحة
arcpy.env.overwriteOutput = صحيح
arcpy.env.workspace = "D: TEMP Test"
arcpy.env.outputCoordinateSystem = "C: Program Files (x86) ArcGIS Desktop10.0 Coordinate Systems Projected Coordinate Systems UTM NAD 1983 NAD 1983 UTM Zone 16N.prj"

عدد المعالجات التي سيتم استخدامها معدة بحد أقصى ناقص 1
prc = int (os.environ ["NUMBER_OF_PROCESSORS"]) - 1

# إنشاء وبدء مجموعة من العمليات العاملة
تجمع = معالجة متعددة. Pool (prc)

# يحصل على كل الطبقات في MXD الحالي
lyrs = خرائط أركبي.

# حلقات خلال كل طبقة ويحصل على اسم البيانات المصدر والمسار
لـ lyr في lyrs:
د = lyr.dataSource
طباعة "تمرير" + d + "إلى مجموعة المعالجة"
arcpy.AddMessage ("تمرير" + d + "إلى مجموعة المعالجة")
pool.apply_async (عامل (د))


  • لتسهيل عرض الكود الخاص بك ، عند لصقه ، حدد كل التعليمات البرمجية الخاصة بك وانقر فوق الزر # في الأعلى - سيؤدي ذلك إلى تقديمه كرمز ، وبالتالي الحفاظ على المسافة البادئة.

  • حاول طباعة prc و lyrs قبل حلقة المعالجة المتعددة ، باستخدام arcpy.AddMessage (str (prc) + '-' + str (len (lyrs)) '-' + str (lyrs)) ، حتى تتمكن من التحقق من أنها تبدو مثلك تتوقعها.

  • لا أعرف حقًا كيف يعمل الشيء متعدد المعالجة بالضبط ، لكني كنت أستخدمه قليلاً. من واقع خبرتي ، أعتقد أنك بحاجة إلى إضافة الوظائف إلى خادم الوظائف (مجرد قائمة Python) والحصول على نتيجة من كل عامل. لقد قمت بتعديل الكود الخاص بك لجعل كل عامل يعيد سلسلة ، ثم أطبع رسالة تخبرك عندما ينتهي كل عامل.

اسمحوا لي أن أعرف كيف تحصل على.

شكرًا للمساعدة التي عملت عليها لمدة يومين متتاليين ، حيث يمكنني الاستفادة من العديد من الأشياء من خلال وجود عملية أو كل طبقة في mxd. لقد تخليت عن واحد النائب واستخدمت بيثون pp. كنت أستخدم مشروعك كمثال http://pythongisandstuff.wordpress.com/author/stacyrendall/. لدي أيضًا مشكلة في التثبيت مع برنامج ArcView ، مما أدى إلى تفاقم مشكلاتي. الكود أدناه ، الذي انتهيت منه للتو ، يحفظ الطبقات في mxd محفوظ. قمت بتشغيله كخيط واحد واستغرق الأمر 420 ثانية. ركضت باستخدام pp libary واستغرق الأمر 151 ثانية من Python و 154 كأداة ، لذلك تحسن كبير. لم أتمكن أبدًا من الحصول على الوظائف لبدء استخدام mp ، والآن بعد أن حصلت على بعض الفهم للصفحات أعتقد أنني سألتزم بها.

اختبرت التعديل الخاص بك. ما زلت تعمل كعملية واحدة. شكرا للمساعدة صفحة الويب الخاصة بك كانت مفيدة للغاية

أعتقد أن هناك طريقة واحدة مؤكدة لمعرفة ذلك ، ولكن ... هل لديكم أي أفكار حول كيفية استخدام الذاكرة و / أو إعادة تدويرها من أجل العمليات المتعددة أو الثعبان المتوازي؟ في الأيام الخوالي ، اضطر الكثير منا إلى إنشاء عمليات منفصلة (ملف python. exe منفصل) باستخدام عملية spawnv أو عملية فرعية. في الأساس ، كان هذا ببساطة لأن كائن gp (أو arcpy) كان يعاني من بعض مشاكل تسرب الذاكرة السيئة حقًا ، وأي تطبيق يدعم gp (python.exe) سينفد تدريجيًا من الذاكرة عند تشغيل الأدوات في حلقة. كمكافأة إضافية ، يمكنك كتابة رمز إضافي لـ "إدارة" العمليات المنفصلة كعملية psudo-paralle. تم تحسين مشكلات تسرب ذاكرة gp / arcpy بشكل كبير ، ولكنها لا تزال تمثل مشكلة كبيرة بالنسبة لـ "المهام الشاقة"

على أي حال ، أشعر بالفضول إذا كان بإمكان الصفحات أو العمليات المتعددة تجنب مشكلات تسرب الذاكرة هذه بطريقة أو بأخرى. في مثال pp ، أرى أنك تقوم بتسليم العملية المتوازية نفس كائن Arcpy الذي يتم تكوينه بشكل رئيسي. هل تستخدم جميع العمليات الفرعية (ومن المفترض أن تضيف إلى استهلاك الذاكرة) نفس مثيل Arcpy؟ في المعالجة المتبادلة أنا على سبيل المثال ، بما أنني لا أرى مثل الكود الصريح كما في مثال pp ، أفترض أن العمليات الفرعية افتراضيًا لها فقط إمكانية الوصول إلى جميع المتغيرات العامة بشكل رئيسي؟

أنا أفكر في أن pp و / أو المعالجة المتعددة ستظل تعاني من استهلاك ذاكرة gp / arcpy تدريجيًا وكارثيًا ، لكن لا يمكنني الانتظار لتجربة بعض الأشياء بنفسي. شكرًا جزيلاً على طرح هذه الأمثلة.

كريس في مثال PP الخاص بي أستخدم "In_memory" ، والذي يستخدم جزءًا من ذاكرة الوصول العشوائي الخاصة بك للاحتفاظ بالبيانات ، لتسريع وظائف wrker التي تعمل بالتوازي. تصنع كل "مهمة" كائن "In_memory" فريد ، لذا تأكد من حذفه قبل انتهاء وظيفة wrker. بالنسبة إلى تسريبات ذاكرة البرنامج ، أفترض أنها جميعًا لا تزال موجودة وستكون مشكلة أفضل بكثير إذا تم تشغيل الكود كعملية واحدة ، فقد تكون قادرًا على إجراء عملية من جزأين لتنظيف الذاكرة من نصف الطريق إذا كنت واجهت مشاكل في الذاكرة ، لكنني لم أقترب حتى من أشيائي.

يجب أن يكون رمز pp (واحد فقط حصلت عليه للعمل) خارج العملية ، لذا فإن "prc" في المثال الخاص بي يحدد عدد العمليات التي يجب أن تبدأ (5 من أجل Intel 980X الخاص بي). كل عملية عبارة عن عملية بيثون (32 بت) مع تخصيص الذاكرة الخاص بها ، تمامًا مثل استخدام عملية النشر أو العملية الفرعية. ثم يتم تغذية جميع الوظائف بمجموعة من العمليات الخمس ويتم تشغيل هذه العمليات الخمس نفسها من خلال الوظائف حتى يتم الانتهاء من جميع الوظائف.

في الاختبار الذي أجريته ، لم أواجه أي مشاكل في الذاكرة. إذا كنت تستخدم "In_memory" ، فتأكد من عدم تحميل كائنات كبيرة حقًا (مثل ميزة 1GB clas) في ذلك ، وهناك أيضًا العديد من القيود على ما يمكن وما لا يمكن استخدامه "In_memory" ، لكنني أستخدمها طوال الوقت وهي يمكن حقًا تسريع المعالجة ، بعض الوقت بمعدل 4 مرات أسرع.

كما أن mp.pool "يولد" عمليات جديدة ، لكنني لم أتمكن أبدًا من جعله يعمل بشكل صحيح ، فقد أردت دائمًا تشغيل كل شيء في عملية واحدة. سيبدأ التجمع ، لكنه يغذي عملية واحدة فقط. PP مجاني ويبدو أنه يعمل بشكل جيد ، لذلك هذا ما سأستخدمه.

يرجى الاطلاع على http: //pythongisandstuff.wordpress.c. / stacyrendall / بالنسبة لبعض المشكلات المعروفة مع mp و PP ، ستجده في أسفل الصفحة.

من المثير للاهتمام أن المعالجة المتعددة لا تعمل من أجلك ، هل يمكنك التأكد من عدم وجود خطأ ، ولكن فقط تشغيل عملية واحدة في كل مرة؟ أنا أستخدم مكتبة Multiprocessing حصريًا الآن ، حيث يبدو أن PP لا يمكنه التعامل مع الامتدادات ، ولكن لم تواجه أي مشاكل معها.

لا أعرف الكثير عن تفاصيل استخدام الذاكرة ، لكنني تعلمت بعض الأشياء (كل ذلك فيما يتعلق باستخدام مكتبة المعالجة المتعددة ، لكنها قد تلقي بعض الضوء على PP أيضًا). تأخذ العمليات الفرعية وظيفة من مجموعة الوظائف ، وتكملها ، وتتولى الوظيفة المتاحة التالية وما إلى ذلك. ومع ذلك ، يبدو أنهم يحتفظون ببعض (وليس كل) الذاكرة التي كانوا يستخدمونها إذا شاهدت العمليات بمرور الوقت ستزداد بصمة الذاكرة لكل منها. عند تشغيل بعض النماذج التي تتضمن محلل الشبكة مع 4 عمليات فرعية ، ومجموعة عمال مكونة من 56 عنصرًا مبدئيًا ، تلقيت خطأ في الذاكرة بعد أن نمت المساحة الإجمالية لجميع العمليات الأربع إلى حوالي 4 جيجابايت ، أي في منتصف الطريق تقريبًا عبر المجمع. لم يكن هذا قريبًا من حدود الكمبيوتر الذي كنت أستخدمه. كان أفضل تخميني هو أن كل الذاكرة لا تزال مملوكة للعملية الرئيسية ، وبالتالي كانت تصل إلى حد 32 بت ، لكن الأرقام لا تضيف في الواقع لدعم هذه النظرية.

الطريقة السهلة للتغلب على هذا لم يتم إصلاحها حتى Python 2.7 ، حيث يمكنك تعيين قيمة maxtasksperchild على الرغم من أنها لا تعمل بشكل جيد - تتطلب كودًا أكثر تعقيدًا ، والذي إما يتوقف أو يعمل ببطء شديد.

والطريقة الصعبة هي إعادة إنشاء البركة كل n مرة لكل طفل ، اعتمادًا على حجم العمليات التي يقوم بها العمال. من الواضح أنها ليست جميلة ، لكنها تعمل بشكل جيد. لقد استخدمت عددًا من أجهزة الكمبيوتر ومزيجًا من نظامي التشغيل Windows 7 و XP أثناء اختبار كل هذه الأجهزة ، ويبدو أنه في بعض الأحيان تكون العمليات المتوازية الأولى في بعض أجهزة الكمبيوتر أبطأ بكثير من العمليات اللاحقة ، بنسبة 4 على الأقل 7x. إذا كان هذا يحدث على جهاز كمبيوتر ، فأنت تريد n على أعلى مستوى ممكن لتقليل عدد المهام التي تتم أولاً من خلال التجمع. إذا لم يكن الأمر كذلك ، فيمكنك أيضًا إعادة إنشاء المسبح بعد تشغيل كل عملية متوازية مرة واحدة.

اسمحوا لي أن أعرف إذا كنت تريد المزيد من المعلومات ، وسأحاول الحصول على مثال على مدونتي عاجلاً وليس آجلاً!


معالجة مجموعة كبيرة من البيانات النقطية

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

يعد تحليل البيانات ، المعروف أيضًا باسم فرق تسد ، إستراتيجية شائعة تستخدم في الحوسبة المتوازية والتي سنستفيد منها لمعالجة مجموعة بيانات نقطية كبيرة بشكل متوازي. يمكن تصنيف الخوارزميات المستخدمة في أدوات تحليل البيانات النقطية على نطاق واسع إلى أربع فئات - العمليات المحلية والبؤرية والمنطقية والعالمية. للحصول على مزيد من التعمق في أنواع عمليات البيانات النقطية المستندة إلى الخلايا ، اقرأ هذه المقالة. من السهل برمجة العمليات النقطية المحلية والبؤرية والمنطقية عندما يتعلق الأمر بتحلل البيانات. بمجرد تحليل البيانات بشكل مناسب ، يمكن تشغيل كل "جزء" من البيانات بشكل مستقل عن طريق عملية دون الحاجة إلى التواصل مع العمليات الأخرى. ومع ذلك ، فإن عمليات البيانات النقطية العالمية أصعب للتكامل مع تحليل البيانات وتتطلب الاتصال بين العمليات. دعونا نلقي نظرة على مثال لمعالجة مجموعة بيانات نقطية كبيرة باستخدام عملية خطوط المسح الرياضية المحلية ، الجذر التربيعي. العمليات المحلية ، أو العمليات لكل خلية ، هي أبسط عمليات الموازاة باستخدام استراتيجية "القسمة والقهر" ، نظرًا لأن القيمة الناتجة في كل خلية تعتمد فقط على قيمة الإدخال في موقع الخلية هذا. لكل خلية ، تحسب أداة الجذر التربيعي الجذر التربيعي للقيمة من تلك الخلية. قد يعني استخدام الأداة بشكل متسلسل تشغيل أداة Square Root على مجموعة البيانات الكبيرة بالكامل ، ولكن هذه العملية قد تستغرق وقتًا طويلاً.

نهج تسلسلي افتراضي غير محسن لمعالجة البيانات النقطية الكبيرة

بدلاً من ذلك ، من خلال تحليل البيانات ، يمكننا إعادة تصميم مهمة التحليل لاستخدام عمليات عاملة متعددة في وقت واحد ، وبالتالي تحسين أداء التحليل العام. يوضح الرسم أدناه تقسيم مجال البيانات النقطية الكبيرة إلى عدة أجزاء أصغر ، واستخدام عمليات عاملة متعددة لإجراء تحليل في نفس الوقت على كل قسم من الأقسام الفرعية. ثم يتم تجميع النتائج معًا مرة أخرى للحصول على الإخراج النهائي.

المعالجة المتعددة للخطوط النقطية الكبيرة المتوازية

تتم مشاركة نموذج نصي على GitHub هنا والذي يتعمق في كيفية حل هذه المشكلة برمجيًا باستخدام ArcGIS Desktop و Python المعالجة المتعددة وحدة.


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

أنا & # x27m أعمل على التكرار من خلال عدد كبير من مجموعات البيانات (900+) وتنفيذ الكثير من عمليات الذاكرة المكثفة على كل منها. ما تم إعداده سابقًا للتكرار خلال فئات ميزات gdb بطيء جدًا وأنا أتطلع إلى التحرك نحو المعالجة المتعددة (باستخدام shp) في محاولة لحل هذه المشكلة.

سؤالي هو ، عندما أقوم بتشغيل برنامج نصي مستقل يتضمن أسلوب المعالجة المتعددة وطرق التجميع ، يعمل البرنامج النصي بشكل رائع وأنا أقوم بتخزين 900+ من فئات الميزات في 5 دقائق. عندما أقوم بدمج هذا الجزء في البرنامج النصي الرئيسي الخاص بي ، يبدو أن مهلة النص تنتهي على الرغم من أنه لا ينبغي أن يكون هناك & # x27t أي مشكلات ذاكرة معلقة (لا توجد طبقات ، ولا شيء مكتوب في الذاكرة).

هل من الأفضل لي كتابة كل خطوة عملية في ملف .py منفصل واستيراد كل خطوة؟

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

تحرير: لماذا التصويت معارِض؟ هل يجب أن أوضح شيئًا أكثر؟


وقت معالجة Python Script باستخدام Pythonwin vs. Script Tool

أتساءل عما إذا كان أي شخص قد واجه اختلافًا كبيرًا في الوقت الذي يستغرقه تنفيذ نص Python كأداة نصية مقابل مباشرة في Python أو Pythonwin IDE؟ أقوم بتشغيل البرنامج النصي الخاص بي في Pythonwin (Python 2.7.8 ، 32 بت) ويستغرق الأمر حوالي 17 دقيقة ولكن عندما أقوم بتشغيل نفس البرنامج النصي كأداة نصية في ArcCatalog (الإصدار 10.3.1) الوقت المنقضي: 7 ساعات و 39 دقيقة و 44 ثانية . هذا فرق مذهل وأنا أتساءل ما هي المشكلة. هذا موجود في بيئة Citrix الخاصة بنا ، لذا لا تعمل البرامج على كمبيوتر سطح المكتب الخاص بي ولكن على Citrix Blade. ما اعتقدت أنه برنامج نصي يوفر حلاً عمليًا ليس إذا قمت بتوزيعه في صندوق أدوات ، فإنه يستغرق وقتًا أطول للتشغيل (مثل طوال اليوم).

لدي برنامج نصي يقوم بما يلي (يمكنني نشر الرمز الكامل إذا كان ذلك مفيدًا ، على الرغم من أنه طويل إلى حد ما وهذا سؤال عام):

الملخص: يُنشئ نسخًا متماثلة أحادية الاتجاه إلى ملف gdb من مثيل SDE Enterprise (Oracle) الخاص بشركتنا إلى نظام حفظ ملفات مركز البيانات الخاص بنا ، ثم يدفعه إلى جهاز التخزين المتصل بالشبكة الخاص بنا باستخدام Robocopy ثم يرسل بريدًا إلكترونيًا لملف السجل.

يبدأ وحدة التسجيل في ملف السجل

يتحقق من مدخلات SDE لمتطلبات النسخ (يتم تعيين إصدارات لمجموعات البيانات وتحتوي فئات / جداول الميزات على GlobalIDs)

إذا كان المخطط == "S_R10_CNF" و str (child.isVersioned) == 'False':

logging.info ("الطفل <0> ليس مسجلاً كنسخة". تنسيق (child.Name))

logging.info ("محاولة التسجيل")

logging.info ("تم تسجيل <0> بإصداره بنجاح". تنسيق (child.Name))

logging. warning ("تعذر التسجيل باسم Versioned بسبب استثناء: <0>" .format (e.message))

logging. warning ("<0> غير مسجل على أنه إصدار ولن يتم نسخه" .format (child.Name))

من مجموعات الاستيراد الافتراضي ديكت

لـ fc في arcpy.ListFeatureClasses (""، ""، ds):

لـ tb في arcpy.ListTables ('S_R10_CNF. *'):

طباعة ('<0> يفتقد تنسيق GLOBALID في الجدول <1>'. (tb))

logging.info ("<0> يفتقد GlobalIDs! محاولة إضافتها." .format (i))

logging.info ("تمت إضافة GlobalIDs إلى مجموعة البيانات: <0>" .format (i))

logging.warn ("غير قادر على إضافة GlobalIDs إلى مجموعة البيانات <0> n بسبب الاستثناء: <1>" .format (i، e.message))

logging.warn ("ما يلي ليس به GlobalIDs ولن يتم نسخه بشكل متماثل: <0>" .format (i))

ينشئ ملف الإخراج GDB إذا لم يكن موجودًا بالفعل

إن لم يكن arcpy.Exists (gdbName):

logging.info ("Created target child GDB" + gdbName)

يُنشئ اسمًا للنسخة المتماثلة استنادًا إلى اسم مجموعة البيانات

replicaName = replicaBase + "_NAS1Way"

truncLen = 32 - len ("_ NAS1Way")

إذا كان len (replicaName) & gt 32: # يمكن أن يكون الاسم المتماثل 32 حرفًا فقط أو أقل أو ستفشل النسخة المتماثلة مع ظهور رسالة خطأ غامضة

يتحقق مما إذا كانت النسخة المتماثلة موجودة بالفعل ، وإذا كان الأمر كذلك ، فإنها تقوم بمزامنة البيانات الأولية ونسخها ، وإذا لم تكن كذلك ، فإنها تقوم بإنشاء النسخة المتماثلة

# تحقق من أسماء النسخ المتماثلة في كل من الوالدين والطفل

replicaList = [x.name.partition (".") [2] لـ x في arcpy.da.ListReplicas ()]

replicaListGDB = [x.name لـ x في arcpy.da.ListReplicas (outGDB)]

إذا كان اسم النسخ المتماثل في قائمة النسخ المتماثلة:

إذا كانت النسخة المتماثلة في قائمة النسخ المتماثلة GDB:

arcpy.SynchronizeChanges_management (outGDB، "DBO." + replicaName، arcpy.env.workspace، "FROM_GEODATABASE2_TO_1")

logging.info ("نسخة متماثلة أحادية الاتجاه متزامنة لـ: <1>" .format (replicaName، DS))

logging.warn ("اسم النسخة المتماثلة <0> موجود في SDE الأصلي ولكن ليس في GDB الفرعي" تنسيق. (اسم متماثل))

logging.warn ("إلغاء تسجيل النسخة المتماثلة <0> ، حذف البيانات الفرعية ، وتشغيل مرة أخرى!". تنسيق (اسم متماثل))

خطأ في التسجيل ("غير قادر على مزامنة النسخة المتماثلة <0> n بسبب استثناء: <1>" تنسيق. (اسم متماثل ، رسالة إلكترونية))

status = 'Synchronizing metadata for <0>'. تنسيق (DS)

خطأ في التسجيل ("تعذر مزامنة البيانات الوصفية <0> n بسبب استثناء: <1>" تنسيق. (اسم متماثل ، رسالة إلكترونية))

status = 'Creating 1 Way Replica for <0>' تنسيق (DS)

arcpy.CreateReplica_management (featureList، "ONE_WAY_REPLICA"، outGDB، replicaName، "FULL"، ""، "ALL_ROWS"، ""، "GET_RELATED")

logging.info ("Created One Way Replica for: <0>" .format (DS))

logging.info ("تم تسمية النسخة المتماثلة: <0>". تنسيق (اسم متماثل))

خطأ في التسجيل ("تعذر إنشاء نسخة متماثلة لمجموعة البيانات <0> n بسبب استثناء: <1>" تنسيق. (DS ، رسالة إلكترونية))

يستدعي Robocopy من خلال وحدة العملية الفرعية لنسخ الملف GDB إلى محرك NAS

subprocess.call (r'NET USE Z: / del ')

subprocess.call (r'NET USE Z: <0> / user: & ltusername & gt pwd'.format (destPath))

status = "دفع تغييرات GDB المتماثلة إلى تنسيق NAS Drive" (destPath)

subprocess.call (["robocopy"، gdbPath، "Z:"، "*. *"، "/ e"، "/ z"، "/ dcopy: T"، "/ purge"، "/ xo"، " / xf "،" * .lock "،" <0> ".format (os.path.join (gdbPath،" robocopy_log.txt "))،" / fft "،" / log: <0> ".format ( os.path.join (gdbPath، "robocopy_log.txt"))، "/ tee"])

يرسل بريدًا إلكترونيًا لملف السجل

mailserver.sendmail (fromEmail ، toEmailList ، msg)

يبدو أن أبطأ أجزاء البرنامج النصي تعمل على تشغيل arcpy.SynchronizeChanges_management عندما تكون في Toolbox Script Tool ، حتى في حالة عدم وجود تغييرات للمزامنة! تم تحديد المربع لتشغيل Python Script in Process.

أنا أبحث في استخدام المعالجة المتعددة حيث يوجد 16 مركزًا على خادم Citrix لتشغيل بعض عمليات الفحص وإنشاء نسخ متماثلة لتسريع الأمور. هل لدى أي شخص أي فكرة عن سبب استغراق نفس البرنامج النصي وقتًا يبعث على السخرية كأداة نصية مقارنةً ببايثون مباشرةً بدون تكلفة ArcGIS؟


1.5.1.1 تحويل البرنامج النصي إلى أداة

الآن ، دعنا نحول هذا البرنامج النصي إلى أداة نصية في ArcGIS Pro لنتعرف على العملية وسنقوم بفحص الاختلافات بين ArcGIS Desktop و ArcGIS Pro عندما يتعلق الأمر بالعمل مع أدوات البرنامج النصي (تلميح: لا يوجد أي شيء آخر غير تبدو الواجهة مختلفة قليلاً).

سنبدأ بفتح ArcGIS Pro. سيُطلب منك تسجيل الدخول (استخدم حساب Penn State ArcGIS Online الذي يجب أن يكون لديك بالفعل) وإنشاء مشروع عند بدء Pro.

يعد تسجيل الدخول إلى ArcGIS Pro تطورًا هامًا وجديدًا لتشغيل التعليمات البرمجية في Pro مقارنةً بسطح المكتب. كما تعلم ، تعمل Pro بهيكل ترخيص مختلف بحيث يكون بانتظام "هاتف المنزل" لخوادم ترخيص Esri للتحقق من أن لديك ترخيصًا صالحًا. باستخدام سطح المكتب ، بمجرد تثبيته وإعداد الترخيص الخاص بك ، يمكنك تشغيله لمدة 12 شهرًا كان الترخيص صالحًا ، سواء عبر الإنترنت أو دون اتصال ، دون أي مشاكل. نظرًا لأن Pro سيتحقق بانتظام مع Esri ، فنحن بحاجة إلى أن نضع في اعتبارنا أنه إذا توقف كودنا عن العمل بسبب عدم وجود خطأ مرخص أو بسبب مشكلة ترخيص عامة ، يجب أن نتحقق من أن Pro لا يزال قيد تسجيل الدخول. الجميع ، لن تكون هذه مشكلة لأنك ستستخدم بشكل عام Pro على جهاز كمبيوتر متصل بالإنترنت ولن تلاحظ عمليات التحقق من الترخيص. إذا جعلت جهاز الكمبيوتر الخاص بك في وضع عدم الاتصال لفترة طويلة ، فستحتاج إلى التحقق من خيارات ترخيص Esri في وضع عدم الاتصال.

المشاريع هي طريقة Pro للاحتفاظ بجميع الخرائط والتخطيطات والمهام والبيانات وصناديق الأدوات وما إلى ذلك منظمة. إذا كنت قادمًا من سطح المكتب ، ففكر في الأمر على أنه MXD مع بعض الميزات الإضافية (مثل السماح بتنسيقات متعددة لخرائطك).

اختر إنشاء مشروع جديد باستخدام القالب الفارغ ، وامنحه اسمًا ذا معنى وضعه في مجلد مناسب لجهازك المحلي.

سيكون لديك بعد ذلك Pro يعمل مع صندوق الأدوات الخاص بك الذي تم إنشاؤه بالفعل. في الشكل أدناه ، قمت بالنقر فوق Toolboxes لتوسيعه لإظهار مربع الأدوات الذي يحمل نفس اسم مشروعي.

إذا نقرنا بزر الماوس الأيمن على مربع الأدوات الخاص بنا ، فيمكننا اختيار إنشاء برنامج نصي جديد & gt.

ستظهر نافذة تسمح لنا بإدخال اسم للبرنامج النصي ("Lesson1A") وتسمية للبرنامج النصي ("Geog 489 Lesson 1A") ، ثم سنستخدم رمز استعراض الملف لتحديد موقع ملف البرنامج النصي. حفظها في وقت سابق. إذا لم يظهر النص البرمجي في هذا المجلد أو تلقيت رسالة تقول "الحاوية فارغة" ، فاضغط على F5 على لوحة المفاتيح لتحديث العرض.

لن نختار "استيراد نص برمجي" أو تحديد أي معلمات (حتى الآن) أو التحقيق في التحقق من الصحة (حتى الآن). عندما نضغط على "موافق" ، سنحصل على أداة البرنامج النصي الخاصة بنا التي تم إنشاؤها في Pro. لن نقوم بتشغيل أداة البرنامج النصي الخاصة بنا (حتى الآن) لأنها تتوقع حاليًا العثور على بيانات foxlake DEM في C: data elevation وإعادة كتابة النتائج إلى هذا المجلد وهو أمر غير ملائم للغاية. كما أن لديها قطعًا ثابتًا يبلغ 3500 مضمن في الكود. يمكنك تنزيل FoxLake DEM هنا.

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

يمكننا تعديل البرنامج النصي الخاص بنا من داخل Pro ، ولكن إذا فعلنا ذلك ، يتم فتحه في Notepad التي ليست أفضل بيئة للترميز. يمكنك استخدام Notepad إذا أردت ، لكنني أقترح فتح البرنامج النصي مرة أخرى في محرر النصوص المفضل لديك (أحب Notepad ++) أو مجرد استخدام سبايدر.

إذا أردت ، يمكنك تغيير هذا المحرر المفضل عن طريق تعديل خيارات المعالجة الجيولوجية لـ Pro (راجع http://pro.arcgis.com/en/pro-app/help/analysis/geoprocessing/basics/geoprocessing-options.htm). للوصول إلى هذه الخيارات في Pro ، انقر فوق Home - & gt Options - & gt Geoprocessing Options. هنا يمكنك أيضًا تحديد خيار للتحقق تلقائيًا من صحة الأدوات والبرامج النصية للتوافق مع Pro (لذلك لا تحتاج إلى تشغيل Analyze Tools for Pro يدويًا في كل مرة).

سنقوم بإجراء بعض التغييرات على الكود الخاص بنا الآن ، مع تبديل المسارات المشفرة في الأسطر 8 و 17 وقيمة cutoffElevation المشفرة في السطر 9. ونقوم أيضًا بإعداد متغير outPath في السطر 10 وتعيينه على arcpy .env. Workspace.

قد تتذكر من GEOG 485 أو تجربتك الأخرى مع سطح المكتب أن مساحة العمل الافتراضية في سطح المكتب هي عادةً default.gdb في مسار المستخدم الخاص بك. يعد Pro أكثر ذكاءً من ذلك ويعين مساحة العمل الافتراضية لتكون قاعدة البيانات الجغرافية لمشروعك. سنستفيد من ذلك لوضع البيانات النقطية للإخراج في مساحة عمل مشروعنا. لاحظ الاختلاف في نوع المعلمة التي نستخدمها في الأسطر 8 و 9. لا بأس أن نحصل على المسار كنص ، لكننا لا نريد الحصول على الرقم في cutoffElevation كنص لأننا نحتاج إليه ليكون عدد.

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

بمجرد إجراء هذه التغييرات ، احفظ الملف وسنعود إلى أداة النص البرمجي في Pro ونحدّثه لاستخدام المعلمات التي حددناها للتو. انقر بزر الماوس الأيمن فوق أداة البرنامج النصي داخل مربع الأدوات واختر خصائص ثم انقر فوق المعلمات. The first parameter we defined (remember Python counts from 0) was the path to our input raster (inRaster), so let's set that up. Click in the text box under Label and type “Input Raster” and when you click into Name you’ll see that Name is already automatically populated for you. Next, click the Data Type (currently String) and change it to “Raster Dataset” and we’ll leave the other values with their defaults.

Click the next Label text box below your first parameter (currently numbered with a *) and type “Cutoff Value” and change the Data Type to Long (which is a type of number) and we’ll keep the rest of the defaults here too. The final version should look as in the figure below.

Click OK and then we’ll run the tool to test the changes we made by double-clicking it. Use the file icon alongside our Input Raster parameter to navigate to your foxlake raster (which is the FoxLake digital elevation model (DEM) in your Lesson 1 data folder) and then enter 3500 into the cutoff value parameter and click OK to run the tool.

The tool should have executed without errors and placed a raster called foxlake_hi_10 into your project geodatabase.


1.5.1 Making a Script Tool

Here’s another simple script that finds all cells over 3500 meters in an elevation raster and makes a new raster that codes all those cells as 1. Remaining values in the new raster are coded as 0. By now, you’re probably familiar with this type of “map algebra” operation which is common in site selection and other GIS scenarios.

Just in case you’ve forgotten, the expression Raster(inRaster) tells arcpy that it needs to treat your inRaster variable as a raster dataset so that you can perform map algebra on it. If you didn't do this, the script would treat inRaster as just a literal string of characters (the path) instead of a raster dataset.

You can probably easily work out what this script is doing but, just in case, the main points to remember on this script are:

  • Notice the lines of code that check out the Spatial Analyst extension before doing any map algebra and check it back in after finishing. Because each line of code takes some time to run, avoid putting unnecessary code between checkout and checkin. This allows others in your organization to use the extension if licenses are limited. The extension automatically gets checked back in when your script ends, thus some of the Esri code examples you will see do not check it in. However, it is a good practice to explicitly check it in, just in case you have some long code that needs to execute afterward, or in case your script crashes and against your intentions "hangs onto" the license.
  • inRaster begins as a string, but is then used to create a Raster object once you run Raster(inRaster). A Raster object is a special object used for working with raster datasets in ArcGIS. It's not available in just any Python script: you can use it only if you import the arcpy module at the top of your script.
  • cutoffElevation is a number variable that you declare early in your script and then use later on when you build the map algebra expression for your outRaster.
  • The expression outRaster = Raster(inRaster) > cutoffElevation is saying, in plain terms, "Make a new raster and call it outRaster. Do this by taking all the cells of the raster dataset at the path of inRaster that are greater than the number assigned to the variable cutoffElevation."
  • outRaster is also a Raster object, but you have to call the method outRaster.save() in order to make it permanent on disk. The save() method takes one argument, which is the path to which you want to save.

Copy the code above into a file called Lesson1A.py (or similar as long as it has a .py extension) in spyder or your favorite IDE or text editor and then save it.

We don’t need to do anything to this code to get it to work in Python 3, it will be fine just as it is. Feel free to check it against Analyze Tools for Pro if you like. Your results should say “Analyze Tools for Pro Completed Successfully” with the lack of warnings signifying that the code you supplied is compatible with Python 3.


4 Answers 4

Edit, this workaround is no longer needed as of 2.91.

This looks like a kind of ms-windows specific problem. at least a conflict with having an embedded Python interpreter and the environment which multiprocessing expects. (its not exactly a bug, in that its not like Blender devs can fix some mistake to get this working).

Currently multiprocessing makes the assumption that its running in python و ليس running inside an application.

I managed to get multi-processing working on ms-windows, doing some workarounds.

  • sys.executable needs to point to Python executable.
  • The scripts __file__ needs to point to a file on-disk
    (not always the case - when executing a text block for example).

Heres an example of a workaround:

Blender+Python can do this, but ليس using multiprocessing . $endgroup$ &ndash ideasman42 Jun 22 '15 at 22:22

I think this statement in the same docs says a lot:

"So far, no work has gone into making Blender’s python integration thread safe, so until its properly supported, best not make use of this. "

The statement that subprocess and multiprocess can be used with Blender isn't false, just may be interpreted in reverse with regards to multiprocess module.

  • subprocess can call external apps fine with .call or .Popen , non-blocking or blocking. Works as expected, threaded or non threaded.
  • multiprocess probably doesn't work (right now) as you might expect, how I interpreted this statement originally was, "you can call several instances of Blender from a python program using multiprocessing , that way you have control over what ends when and can use multiple CPU's.

In the end the warning is reasonable clear (I think?) that we aren't to expect threaded execution of calls to Blender functions within the one Blender executable. (for instance function calls that take a lot of time, like baking.. it is possible to write scripts to do all that and finally when all blender processes have ended , merge the result in an additional script. The work (scripting wise) may be a little bit more, but that seems to be where it's at at the moment.

Ubuntu 14.04
On Ubuntu that code leaves headless processes behind, which only finish when the main Blender executable is terminated. If there's a problem it's not entirely localized to windows.


Geoprocessing services can have a result map service to create a digital map image of task results. Digital maps contain visual representations of geographic datasets that communicate information. Digital maps are transported across the Web as images (such as a .jpeg ). A map image, byte for byte, contains far more human-interpretable information than raw features in a feature class. Map images are also manageable—they are easily compressed, they can be tiled into manageable chunks, and there are established methods for transporting and viewing them across the Web.

Map images are created by an ArcGIS for Server map service and are the result of publishing an ArcMap document ( .mxd ). Because of the characteristics of a map image, you may want to create one for the results of your geoprocessing task and transport the image across the Web rather than transporting the result dataset or datasets. Geoprocessing services can have a result map service used by ArcGIS for Server to create map images of your output data.


بناء الجملة

The input feature classes or feature datasets whose coordinates are to be converted.

The location of each new output feature class or feature dataset.

The coordinate system to be used to project the inputs.

Valid values are a Spatial Reference object, a file with a .prj extension, or a string representation of a coordinate system.

The feature class or the feature dataset used to specify the output coordinate system used for projection.

Name of the geographic transformation to be applied to convert data between two geographic coordinate systems (datums).