יותר

מקסום השימוש במעבד


התסריט שלי מצטלב קווים עם מצולעים. זה תהליך ארוך שכן יש יותר מ 3000 קווים ויותר מ 500000 מצולעים. הוצאתי להורג מ- PyScripter:

# ייבוא ​​זמן ייבוא ​​arcpy # הגדר את הסביבה arcpy.env.workspace = r "E:  DensityMaps  DensityMapsTest1.gdb" arcpy.env.overwriteOutput = נכון משתנים inFeatures = [r "E:  DensityMaps  DensityMapsTest.gdb  Grid1km_Clip", "JanuaryLines2"] outFeatures = "JanuaryLinesIntersect" outType = "LINE" # הפוך קווים לקשתיים. ) # הדפס זמן סיום הדפס "סיים" + str (datetime.now () - startTime)


השאלה שלי היא: האם יש דרך לגרום למעבד לעבוד ב 100%? זה פועל ב 25% כל הזמן. אני מניח שהתסריט היה פועל מהר יותר אם המעבד היה 100%. ניחוש שגוי?
המכונה שלי היא:

  • Windows Server 2012 R2 רגיל
  • מעבד: מעבד Intel Xeon E5-2630 0 @ 2.30 GHz 2.29 GHz
  • זיכרון מותקן: 31,6 GB
  • סוג מערכת: מערכת הפעלה 64 סיביות, מעבד מבוסס x64


תן לי לנחש: למעבד שלך יש 4 ליבות, ולכן שימוש של 25% במעבד, הוא 100% שימוש בליבה אחת, ושלוש ליבות סרק.

אז הפיתרון היחיד הוא להפוך את הקוד לשרשור רב, אך זו לא משימה פשוטה.


אני לא כל כך בטוח שמדובר במשימה הקשורה למעבד. הייתי חושב שזו תהיה פעולה עם פלט / פלט, אז הייתי מחפש להשתמש בדיסק המהיר ביותר אליו הייתה לי גישה.

אם E: הוא כונן רשת, אז ביטול זה יהיה הצעד הראשון. אם זה לא דיסק בעל ביצועים גבוהים (<7ms seek), זה יהיה שני. יתכן שתשיג תועלת כלשהי מהעתקת שכבת המצולע ל-לזכרסביבת עבודה, אך היתרון עשוי להיות תלוי בגודל מחלקת תכונות המצולע והאם אתה משתמש בעיבוד רקע של 64 סיביות.

אופטימיזציה של תפוקת קלט / פלט היא לעתים קרובות המפתח לביצועי GIS, לכן אני ממליץ לך לשים לב פחות למד המעבד ויותר תשומת לב לרשת ולמדי הדיסק.


היו לי בעיות דומות של ביצועים לגבי סקריפטים של ארקפי, צוואר הבקבוק העיקרי הוא לא מעבד זה הכונן הקשיח, אם אתה משתמש בנתונים מהרשת זה התרחיש הגרוע ביותר, נסה להעביר את הנתונים שלך לכונן SSD ואז הפעל את הסקריפט שלך משורת הפקודה לא מ- pyscripter, pyscripter מעט איטי יותר יכול להיות מכיוון שהוא מכיל כמה דברים באגים, אם אתה לא מרוצה שוב, תחשוב על הקבלה של הסקריפט שלך, מכיוון שכל חוט פיתון לוקח ליבת מעבד אחת, המעבד שלך כולל 6 ליבות, כך שתוכל להפעיל 6 תסריטים בו זמנית.


כשאתה משתמש בפייתון וכפי שהוצע לעיל שקול להשתמש בעיבוד רב אם ניתן להריץ את הבעיה במקביל.

כתבתי מאמר קטן באתר geonet על המרת סקריפט פיתון לכלי סקריפט פיתון שניתן להשתמש בו בתוך מודל בונה. המסמך מפרט את הקוד ומתאר כמה מלכודות להפעלתו ככלי סקריפט. זה רק מקום אחד להתחיל לחפש:

https://geonet.esri.com/docs/DOC-3824


כמו שנאמר קודם כדאי להשתמש בריבוי עיבוד או השחלה. אבל כאן מגיע האזהרה: הבעיה חייבת להיות מתחלקת! אז תסתכל על https://en.wikipedia.org/wiki/Divide_and_conquer_algorithms.

אם הבעיה שלך ניתנת לחלוקה היית ממשיך כמו:

  • צור תור שבו אתה שומר את נתוני הקלט לתהליכים / שרשור
  • צור תור בו מאוחסנות התוצאות
  • צור פונקציה או מחלקה שיכולה לשמש כתהליך / חוט הפותר את הבעיה שלנו

אבל כפי שאמר גאוגיק, ייתכן שלא מדובר בבעיה המגבילה את המעבד, אלא בבעיה של IO. אם יש לך מספיק זיכרון RAM תוכל לטעון מראש את כל הנתונים ואז לעבד אותם, מה שהיתרון שניתן לקרוא את הנתונים בבת אחת ולכן לא תמיד קוטע את תהליך החישוב.


החלטתי לבדוק את זה באמצעות 21513 קווים ומצולעים 498596. בדקתי גישה מרובת מעבדים (12 מעבדים במחשב שלי) באמצעות סקריפט זה:

יבוא arcpy, os יבוא רב עיבוד זמן יבוא t0 = time.time () arcpy.env.overwriteOutput = nProcessors אמיתי = תיקייה 4 = r'd:  שריטה 'def פונקציה (קלט): nGroup = כניסות [0] pGons = כניסות [ 1] שורות = קלטים [2] outFeatures = '% s% s% s_% i.shp'% (תיקיה, os.sep, 'inters', nGroup) fids = tuple ([i for i in range (nGroup, 500000) , nProcessors-1)]) lyr = "layer% s"% nGroupFID "ב-% s"% str (fids) arcpy.MakeFeatureLayer_management (pGons, lyr, query) arcpy.Intersect_analysis ([lines, lyr], outFeatures) return outFeatures אם __name__ == "__main__": inPgons = "% s% s% s"% (תיקיה, os.sep, 'parcels.shp') inLines = "% s% s% s"% (תיקיה, os.sep, 'roads.shp') m, bList = 0, [] עבור i בטווח (nProcessors): bList.append ([i, inPgons, inLines]) pool = multiprocessing.Pool (nProcessors-1) listik = pool.map ( פונקציה, bList) ## החל מיזוג כאן הדפס רשימה listik הדפסה ('% i שניות'% (זמן זמן () - t0))

תוצאות, שניות:

  • כונן קשיח מקומי רגיל - 191
  • כונן מקומי מהיר במיוחד - 220
  • כונן רשת - 252

הדבר המצחיק זה לקח 87 שניות בלבד בעזרת כלי הגיבוי מעבד mxd. אולי משהו לא בסדר בגישה שלי לבריכה ...

כפי שאפשר לראות השתמשתי בשאילתת FID מכוערת למדי ב (0, 4, 8,12 ... 500000) כדי להפוך את המשימה לחלוקה.

ייתכן ששאילתה המבוססת על שדה מחושב מראש, למשל. CFIELD = 0 יפחית מאוד את הזמן.

מצאתי גם שהזמן המדווח על ידי כלי רב עיבוד יכול להשתנות מאוד.


אני לא מכיר את PyScripter, אבל אם הוא מגובה על ידי CPython, כדאי ללכת על ריבוי עיבוד ולא ריבוי השחלות כל עוד הבעיה עצמה ניתנת לחלוקה (כמו שאחרים כבר הזכירו את זה).

ל- CPython יש מנעול מתורגמן גלובלי, שמבטל את כל היתרונות ששרשורים רבים יכולים להביא התיק שלך.

בוודאות בהקשרים אחרים חוטי פיתון שימושיים, אך לא במקרים בהם אתה מחובר למעבד.


השאלה שלי היא: האם יש דרך לגרום למעבד לעבוד ב 100%

מכיוון שלמעבד שלך יש מספר ליבות, תוכל למקסם רק את הליבה שהתהליך שלך פועל עליה. תלוי כיצד מוגדר שבב ה- Xeon שלך, הוא יפעל עד 12 ליבות (6 פיזיות ו -6 וירטואליות עם הפעלת חוט יתר). אפילו 64Gbit ArcGIS לא ממש יכול לנצל זאת - וזה יכול לגרום למגבלות מעבד כאשר התהליך המשורשר היחיד שלך ממקסם את הליבה שבה הוא פועל. אתה זקוק ליישום רב-הברגה כדי להפיץ את העומס על פני הליבות או (הרבה יותר פשוט) תוכל להפחית את מספר הליבות שהמעבד שלך פועל כדי להגדיל את התפוקה.

הדרך הקלה ביותר לעצור את הגבלת המעבד (ולוודא שמדובר במגבלת המעבד ולא במגבלות הדיסק / פלט) היא לשנות את הגדרות ה- BIOS עבור ה- Xeon שלך ולהגדיר אותו לליבה אחת מסיבית אחת. עליית הביצועים תהיה משמעותית. רק זכור שזה גם מחליף את יכולת ריבוי המשימות של המחשבים שלך במידה ניכרת ולכן הכי טוב אם יש לך מכונת תהליכים ייעודית ליישום זה. זה הרבה יותר פשוט מאשר לנסות להשחיל את הקוד שלך - שרוב הפונקציות של ArcGIS Desktop (נכון ל- 10.3.1) לא תומכות בכל מקרה.


צפו בסרטון: 30 memaksimalkan penggunaan fillet di Auto CAD (אוֹקְטוֹבֶּר 2021).