המכלול:מגבלות המפענח

מתוך המכלול, האנציקלופדיה היהודית
קפיצה לניווט קפיצה לחיפוש

דפים במכלול (ובמיזמים אחרים המבוססים על מדיה-ויקי) נכתבים ונשמרים בבסיס הנתונים תוך שימוש ב"תחביר ויקי".

חלק מרכזי בתוכנת מדיה-ויקי מכונה "מפענח" (Parser), שמתרגם את תוכן הדף כפי שנראה לעורכים, לקוד HTML שנשלח לדפדפן של הקורא, בתהליך שמכונה "פענוח". פעולת הפענוח כוללת המרה של תחביר ויקי לקוד HTML, והחלפתן של תבניות לטקסט וקוד HTML הנובע מהן.

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

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

דף זה עוסק באילוצים, או במגבלות הללו, ובדרך למצוא את המשאבים שכל דף צורך.

בדיקת המשאבים שהדף צורך

תוכנת מדיה-ויקי מאפשרת לעורך לבדוק את משאבי המפענח שהדף צורך. אחת הדרכים לבדוק זאת מתוארת כאן:

  1. מהתפריט העליון בדף, הקישו "עריכה"
  2. אם נפתח העורך החזותי, עברו לעורך קוד מקור בעזרת העיפרון בצד שמאל של סרגל העריכה
  3. בעורך קוד מקור, הקישו תצוגה מקדימה
  4. גללו לתחתית הדף, וחפשו "מידע על ביצועי המפענח"
  5. אם הטבלה מוסתרת, לחצו על המשולש הקטן מימין להודעה לפתיחת הטבלה

הטבלה, בגרסה 1.34.0 של מדיה-ויקי, נראית כך (המספרים עצמם שונים, כמובן, בכל דף):

זמן CPU 1.368 שניות
זמן אמיתי 1.401 שניות
מספר הצמתים שקדם־המפענח ביקר בהם 13,951/1,000,000
מספר הצמתים שקדם־המפענח יצר 0/1,500,000
גודל הטקסט המוכלל לאחר הפריסה 1,022,596 מתוך 2,097,152 בתים
גודל הפרמטרים של התבניות 13,426 מתוך 2,097,152 בתים
עומק הפריסה הגבוה ביותר 7/40
מספר פונקציות המפענח שגוזלות משאבים 1/500
עומק הרקורסיה של הפריסה 0 מתוך 20
אורך הפריסה לאחר ההרחבה 194,783 בתים מתוך 5,000,000 בתים
מספר ישויות ה־Wikibase שנטענו 0 מתוך 400
שימוש של לואה בזמן 0.675/10.000 שניות
שימוש של לואה בזיכרון 2.5 מגה־בייטים/50 מגה־בייטים

אם אין לכם הרשאות לערוך דף מסוים, עדיין תוכלו למצוא את המידע: מהדפדפן עצמו בקשו לראות את "קוד המקור" של הדף (כאן מדובר לא במה שמכונה "קוד המקור" במכלול, אלא בקוד ה-HTML שנשלח לדפדפן), בדרך כלל בעזרת הקשה על Ctrl+U. בקוד המקור חפשו הערת HTML עם הכותרת newPP. הערה זו מכילה אותם נתונים (וכמה נוספים), אך שמות המשאבים אינם מתורגמים לעברית. המידע הנוסף בהערה, שאינו מופיע בטבלה, יכול לעזור כדי לדעת מי "התבנית הסוררת", שגוזלת את רוב המשאבים.

הערת HTML ‏ newPP, מאותו הדף
<!--
NewPP limit report
Parsed by mw1255
Cached time: 20190523164105
Cache expiry: 2592000
Dynamic content: false
CPU time usage: 1.696 seconds
Real time usage: 1.732 seconds
Preprocessor visited node count: 13951/1000000
Preprocessor generated node count: 0/1500000
Post‐expand include size: 1022596/2097152 bytes
Template argument size: 13426/2097152 bytes
Highest expansion depth: 7/40
Expensive parser function count: 1/500
Unstrip recursion depth: 0/20
Unstrip post‐expand size: 194783/5000000 bytes
Number of Wikibase entities loaded: 0/400
Lua time usage: 0.749/10.000 seconds
Lua memory usage: 2.45 MB/50 MB
-->
<!--
Transclusion expansion time report (%,ms,calls,template)
100.00%  871.947      1 -total
 88.82%  774.436      1 תבנית:לוחות_ממשחק_שחמט
 80.46%  701.552     76 תבנית:לוח_שחמט_מ-FEN
 15.12%  131.804    152 תבנית:לוח_שחמט_מ-FEN/אותיות
 10.83%   94.462      1 תבנית:Pgn
  8.62%   75.188     76 תבנית:עברות_רישום_שחמט
  7.98%   69.598     76 תבנית:עברות_מסע
  6.79%   59.234    152 תבנית:לוח_שחמט_מ-FEN/מספרים
  2.82%   24.572   1064 תבנית:!!
  0.40%    3.489      1 תבנית:משוך_רישום_שחמט
-->

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

משאבים ומגבלות

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

חלק מהמשאבים עוסקים בגודל, חלקם במידת הסיבוך של הדף, וחלקם במשאבים שמשמשים לביצוע קוד לואה.

פירוט נוסף אפשר למצוא בוויקיפדיה האנגלית, בדף en:Wikipedia:Template limits ובדפים נוספים.

  • זמן CPU
    • ל"ידיעה בלבד", לא מתאר משאב חסום. המידע מתאר את מחיר פענוח הדף כולו
  • זמן אמיתי
    • דומה לסעיף הקודם, אבל מתאר כמה זמן עבר מאז השרת החל בפעולת הפענוח, עד שזו הסתיימה. זמן זה יכול להיות פחות או יותר מהקודם, עקב ריבוי משימות מצד אחד, ועיבוד מקבילי מצד שני
  • מספר הצמתים שקדם־המפענח ביקר בהם
    • נתון זה מתאר את מידת ה"סיבוך" של הדף, כאשר הסיבוך תלוי בעיקר בתבניות המופיעות בדף, ותבניות עזר שנקראות על ידן
  • מספר הצמתים שקדם־המפענח יצר
    • גם כאן, הנתון מתאר את רמת הסיבוך בפענוח הדף
  • גודל הטקסט המוכלל לאחר הפריסה
    • נתון זה מתייחס לגודל ולא לסיבוך, כאשר הכללים לחישוב הגודל מורכבים, ומוסברים חלקית בוויקיפדיה האנגלית בדף en:Wikipedia:Post-expand include size
  • גודל הפרמטרים של התבניות
    • סך גודל כל הפרמטרים שמועברים לכל התבניות. אם תבנית משתמשת בפרמטר מסוים מספר פעמים, גודל הפרמטר מוכפל במספר הזה. כל שימוש בכל תבנית נספר, כלומר עבור תבנית שמופיעה מספר פעמים בדף, כל מופע תורם את תרומתו
  • עומק הפריסה הגבוה ביותר
    • מתייחס לתבנית שקוראת לתבנית שקוראת לתבנית וכן הלאה.
  • מספר פונקציות המפענח שגוזלות משאבים
    • פונקציות מפענח מסוימות, כמו למשל {{#קיים, נחשבות "יקרות", ומוטלת מגבלה על מספר הקריאות לפונקציות כאלו מדף אחד
  • עומק הרקורסיה של הפריסה
    • דומה ל"עומק הפריסה", ומתייחס לתבנית שקוראת לעצמה, ישירות או דרך תבנית אחרת
  • אורך הפריסה לאחר ההרחבה
    • נתון זה אינו מתועד, ולא ברור מה הוא מתאר
  • מספר ישויות ה־Wikibase שנטענו
  • שימוש של לואה בזמן
    • כפשוטו
  • שימוש של לואה בזיכרון
    • כפשוטו

שימוש במידע

המידע הזה שימושי כאשר דף גדול מתחיל "לעשות צרות": למשל, הוא אינו מוצג כפי שאנו מצפים, טעינתו אורכת זמן רב, שמירתו אורכת זמן רב, קטגוריית תחזוקה מסתורית מופיעה בתחתיתו, וכן הלאה.

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

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

תיקון דף שנפגע ממגבלות המפענח

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

במקרה הנפוץ, המגבלה היא גודל הטקסט המוכלל לאחר הפריסה (גודל המשאב יכול להיות פחות מהמגבלה, והמפענח עוצר אם ה"דבר" הבא בדף יקפיץ אותו מעבר למגבלה. אם הבעיה היא מגבלה זו, הדף ייתווסף לקטגוריה:דפים שבהם ההכללה גדולה מדי). במקרה זה, יש דרכים אחדות לפתרון הבעיה:

  • פיצול הדף. אידיאלית, השיקול היחיד בהחלטה לפיצול דף צריך להיות תוכני ולא טכני, ופיצול מסיבה טכנית גרידא צריך להישקל רק כמוצא אחרון.
  • צמצום השימוש בתבניות. חישוב "גודל הטקסט לאחר פריסה" אינו טריוויאלי, ואותו טקסט עצמו יכול לצרוך כפליים, פי שלוש, פי שש, או אפילו יותר מאורכו הממשי, כשהוא מגיע דרך תבנית, והגורם בו מוכפל הגודל גדל (לפעמים בפונקציה מעריכית) עם עליית עומק ההכללה: הגדלת "גודל הטקסט לאחר פריסה" בבתים ספורים בתבנית שמוכללת בעומק שש, יכולה להגדיל את הדף שכולל אותה במאות בתים.
    דרך אחת לגשת לפתרון הבעיה היא "שיטת אריה במדבר": למשל, מחיקת מחצית התוכן של דף (בלי שמירה, ממובן...) ובדיקה בעזרת "תצוגה מקדימה" תגלה לנו אם מקור הבעיה בחצי שנמחק, ובשלב הבא אפשר רבע, שמינית, וכולי, עד שמוצאים את התבניות שגורמות לבעיה (או צורכת הרבה גודל). בגלל החשבון הלא טריוויאלי שהוזכר, תבנית ששוקלת בעצמה 300 קילו, יכולה לעלות לדף שמכליל אותה יותר מכך - 300 וגם 900 קילו. הכללים והחישובים לא פשוטים, ויכולים גם להשתנות מגרסה לגרסה - תבנית כזו יכולה גם "לעלות" בדיוק את 300 הקילו שהיא שוקלת. מצד שני, כשמתקיימים התנאים שגורמים להכפלת המחיר, חיסכון של 20 קילו בתבנית מוכללת יכול להתבטא בחיסכון של 40, 60, 120 קילו, ואף יותר, בדף שמכליל אותה. בעזרת "אריה במדבר" (חיפוש בינארי), ניתן למצוא את המקום בו כדאי להשקיע. דרך נוספת היא בעזרת רשימת התבניות שמוכללות בדף (הרשימה מופיעה, לעיתים בצורה מקופלת, מתחת תיבת העריכה ב"תצוגה מקדימה"), ולנסות לזהות תבניות "חשודות" ככבדות. כשמדובר בתבניות ללא פרמטרים (כמו למשל תבניות ניווט מסוימות), אפשר לבדוק את החשד בעזרת שקילת התבנית בדף נפרד: למשל על ידי שקילת דף התיעוד של התבנית, או דף טיוטה ריק בו נכליל אותה. אחרי שזיהינו את התבנית הבעייתית, נשקול אם אפשר פשוט להסיר אותה מהדף, לנסות לטפל בה כך שתשקול פחות, להקטין את מספר הפעמים שהדף מכליל אותה, או, אם אין ברירה אחרת, לפצל את הדף.

במגבלות אחרות יש לטפל באופן שמתאים למגבלה אותה עובר הדף:

  • כאשר המגבלה נובעת מסיבוך ("עומק הפריסה", "עומק הרקורסיה"), צריך למצוא את התבנית המסוימת שמתחפרת לעומק, או ליתר דיוק, את שרשרת ההכללה העבריינית, ולטפל בה.
  • כשהמגבלה היא שימוש יתר בפונקציות מפענח יקרות, התרופה היא בדרך כלל הגבלת השימוש בתבניות שקוראות לפונקציות היקרות - החשודה העיקרית היא פונקציית המפענח #קיים. גם קריאות מסוימות מקוד לואה נספרות כיקרות.
  • אם המגבלה נובעת ממגבלות משאבי לואה, צריך להציץ ב-newPP בקוד המקור של הדף, ולבדוק קריאה לאיזו פונקציה באיזו יחידה היא היקרה ביותר. עורכים שאינם מתמצאים בכתיבת וקריאת יחידות סקריבונטו, יכולים לבקש עזרה בנקודה הזו, תוך פירוט הממצאים שמצאו עד לנקודה בה החליטו לצעוק.

אפשר לחפש מידע נוסף למציאת דרכים להתמודד עם מגבלות המפענח במדיה ויקי ובוויקיפדיה האנגלית, שמרכזת חלק גדול מהתיעוד. לצורך כך, עדיף למצוא את שמות המשאבים באנגלית: שנו את ממשק המשתמש לאנגלית (על ידי הוספת uselang=en לשורת הכתובת של הדפדפן, או, אם אינכם חשים נוח לעשות זאת, על ידי שינוי זמני של שפת הממשק שלכם בהעדפות). (TODO: הוספת טבלת תרגום לאנגלית לדף זה)

הדף באדיבות ויקיפדיה העברית, קרדיט,
רשימת התורמים
רישיון cc-by-sa 3.0