אם אתם מפתחים תהליכי נתונים ב-Python, בוודאי נתקלתם אי פעם במקרה שבו אתם מריצים קוד על הרבה נתונים – לרוב דרך לולאה על מערך/ רשימה.לאחר שהרצנו את הקוד התהליך רץ, ורץ, וממשיך לרוץ, ועוד קצת – ואנחנו בכלל לא יודעים אם הוא רץ כרגיל או תקוע, שלא לדבר על מתי הוא צפוי להסתיים.
הפתרון לבעיה פשוט למדי – יצירת פונקציית ניטור, כולל תחזית למשך זמן הריצה ומועד הסיום שלה, והרצה שלה בתוך התהליך.
העיקרון של הפונקציה הוא לבדוק כמה רשומות עובדו ביחידת זמן. את זה ניתן לבצע ע"י ריצה באינטרוול מסוים, אשר יכול להיות או כל X רשומות, או כל Y שניות, ומשם לחשב תחזית למשך זמן הריצה.
להלן דוגמה לפונקציה כזו, אשר רצה כל X רשומות:
הפונקציה מקבלת 5 פרמטרים כקלט:
- מונה רשומות שעובדו (מספר האיטרציה הנוכחי).
- מספר הרשומות הכולל הצפוי בריצה.
- אינטרוול לחישוב התחזית – האם נרצה שהתחזית תרוץ כל איטרציה, או כל 1000 איטרציות.
- מועד תחילת הריצה.
- דגל לטובת חישוב זמן הריצה לאחר סיומה, על מנת שהפונקציה תוכל לשמש גם עבור דוח סיכום של הריצה.
הפונקציה מחזירה 4 פרמטרים:
- מספר הרשומות שעובדו.
- זמן כולל שעבר מתחילת הריצה.
- זמן כולל מוערך לריצה.
- זמן מוערך שנותר עד לסיום הריצה (זמן כולל פחות הזמן שעבר עד עכשיו).
ניתן להשתמש גם בפונקציה אשר רצה אחת לדקה (או כל אינטרוול זמן אחר) ומחשבת זמן מוערך:
הפונקציה כאן כבר מעט יותר מורכבת, מאחר והיא נדרשת לדגום את מועד הריצה הקודמת של הלולאה, ולבדוק היכן היתה 'קפיצה' באינטרוול הזמן שהוזן. הפרמטר lastTime [מועד הריצה האחרון של הלולאה] הצטרף הן לרשימת הקלט והן לפלט של הפונקציה.
חשוב להדגיש, כי זמני הדיווח לא יהיו בהכרח בדיוק באינטרוול הזמן שהוגדר [לדוגמה: 2 שניות, 4 שניות, 6 שניות וכיו"ב], מאחר ונתון זה תלוי בגורמים נוספים הקשורים לתהליך הריצה – ויש לבחון מהו אינטרוול הזמן המתאים ביותר.
להלן דוגמה לשימוש בפונקציה. בדוגמה נכניס למערך מיליון ערכים רנדומליים בעזרת לולאה. בכל שנייה התהליך ידווח לנו כמה רשומות הוזנו, מועד הניטור, זמן חזוי כולל, וזמן חזוי לסיום:
תוצאת התהליך:
סיכום
ניטור תהליך ריצה הוא כלי חשוב מאוד במהלך פיתוח פתרונות אנליטיים. הוא מסייע בהערכת משך זמן הריצה, בקרת איכות עליה ויעילותה. הכלי קריטי בעיקר בשלבי הפיתוח הראשונים של פתרונות 'כבדים' מבחינת היקף הנתונים בהם, מאחר והוא מאפשר הבנה פשוטה האם התהליך שפותח רץ כראוי, או נתקע – גם מבלי להמתין שעות לסיומו.