דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. מגבלת זיכרון בפונקציית רג'קס בmysql

מגבלת זיכרון בפונקציית רג'קס בmysql

מתוזמן נעוץ נעול הועבר תכנות
10 פוסטים 4 כותבים 310 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • chagoldC מנותק
    chagoldC מנותק
    chagold
    כתב ב נערך לאחרונה על ידי
    #1

    אני מריץ קוד רג'קס על טבלת MYSQL. הרבה רשומות מחזירות את ההודעה דלהלן בגלל שההודעה גדולה מדי

     Warning: #1139 Regex error 'recursion limit exceeded'
    

    יש צורה להסתדר עם זה - אפילו ע"י העתקת המסד לשרת אחר עם יותר זיכרון, או זה תקרת זכוכית?

    תודה

    yossizY ElhananE 2 תגובות תגובה אחרונה
    0
    • yossizY מנותק
      yossizY מנותק
      yossiz
      השיב לchagold ב נערך לאחרונה על ידי
      #2

      @chagold אתה משתמש ב-mariadb? איזה גירסה?

      📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

      chagoldC תגובה 1 תגובה אחרונה
      0
      • ElhananE מנותק
        ElhananE מנותק
        Elhanan
        השיב לchagold ב נערך לאחרונה על ידי Elhanan
        #3

        @chagold אני לא חושב שיש קשר לגודל ההודעה, אני יותר חושב שהRegex שלך לא תקין.
        לפי השגיאה, נראה שהרגקס מבצע יותר מידי פעולות, שחורגות מהמגבלה לרקורסיה (בSql המגבלה היא 100 כעיקרון).
        רקורסיה פירושו כל פעם שפונקציה קוראת לעצמה, בדרך כלל עם קלט אחר שמועבר לפונקציית הילד. זה קורא לעצמו שוב ושוב עד שמגיעים למצב יציאה, ואז מעביר את התוצאות בחזרה לLIFO.
        הבעיה העיקרית עם הרקורסיה היא שהיא יכולה להשתמש בקריאה לפונקציה מקוננת עבור כל אלמנט מעובד. זה מביא להרבה יותר צריכת משאבים, מכיוון שכל קריאת פונקציה צריכה קבוצה משלה של משתנים ופרמטרים מקומיים. וזה ייקח זמן עיבוד נוסף בהשוואה לללולאות.
        בגדול אפשר לשנות את מגבלת הרקורסיה בSql באמצעות האפשרות MAXRECURSION, רק קח בחשבון שאתה חשוף ללולאה אין סופית שתצרוך משאבים גדולים מאוד.
        ההנחת יסוד שלי היא שהתחביר של הרגקס לא תקין, ההמלצה שלי היא שתעלה אותו כאן לבדיקה, לפני שתשנה את מגבלת הרקורסיה.

        פורום איש את רעהו|חיתוך שירים|בלוג|מקצר קישורים|ביו

        chagoldC תגובה 1 תגובה אחרונה
        8
        • chagoldC מנותק
          chagoldC מנותק
          chagold
          השיב לyossiz ב נערך לאחרונה על ידי
          #4

          @yossiz כתב במגבלת זיכרון בפונקציית רג'קס בmysql:

          @chagold אתה משתמש ב-mariadb? איזה גירסה?

          10.5.17-MariaDB-cll-lve - MariaDB Server
          
          תגובה 1 תגובה אחרונה
          0
          • chagoldC מנותק
            chagoldC מנותק
            chagold
            השיב לElhanan ב נערך לאחרונה על ידי
            #5

            @Elhanan כתב במגבלת זיכרון בפונקציית רג'קס בmysql:

            @chagold אני לא חושב שיש קשר לגודל ההודעה, אני יותר חושב שהRegex שלך לא תקין.
            לפי השגיאה, נראה שהרגקס מבצע יותר מידי פעולות, שחורגות מהמגבלה לרקורסיה (בSql המגבלה היא 100 כעיקרון).
            רקורסיה פירושו כל פעם שפונקציה קוראת לעצמה, בדרך כלל עם קלט אחר שמועבר לפונקציית הילד. זה קורא לעצמו שוב ושוב עד שמגיעים למצב יציאה, ואז מעביר את התוצאות בחזרה לLIFO.
            הבעיה העיקרית עם הרקורסיה היא שהיא יכולה להשתמש בקריאה לפונקציה מקוננת עבור כל אלמנט מעובד. זה מביא להרבה יותר צריכת משאבים, מכיוון שכל קריאת פונקציה צריכה קבוצה משלה של משתנים ופרמטרים מקומיים. וזה ייקח זמן עיבוד נוסף בהשוואה לללולאות.
            בגדול אפשר לשנות את מגבלת הרקורסיה בSql באמצעות האפשרות MAXRECURSION, רק קח בחשבון שאתה חשוף ללולאה אין סופית שתצרוך משאבים גדולים מאוד.
            ההנחת יסוד שלי היא שהתחביר של הרגקס לא תקין, ההמלצה שלי היא שתעלה אותו כאן לבדיקה, לפני שתשנה את מגבלת הרקורסיה.

            א. יש רשומות שזה מחזיר תקין.
            ב.

            UPDATE phpbb_posts set post_text = REPLACE(
            
                post_text,
            
            
            
            REGEXP_SUBSTR(post_text, "\\[align=right\\](((?R)|.)*?)\\[\\/align\\]"),
                
                
                CONCAT(
                       '[right]',
                    REGEXP_REPLACE  ( REGEXP_SUBSTR(post_text, "\\[align=right\\](((?R)|.)*?)\\[\\/align\\]"),"^\\[align=right\\](((?R)|.)*?)\\[\\/align\\]", "\\2"),
                    '[/right]'
                
                )
            )
            
            dovidD תגובה 1 תגובה אחרונה
            0
            • dovidD מנותק
              dovidD מנותק
              dovid ניהול
              השיב לchagold ב נערך לאחרונה על ידי
              #6

              @chagold הבעיה נובעת מה?R שבעצם מורה לרג'קס לבדוק בלולאה את קיום הביטוי כולו שוב ושוב במיקום ההוא (אני לא לגמרי מבין למה זה נדרש).
              בקלט מסויים, יכול להיות בגלל אי תקינות, זה עובר את מגבלת הריקורסיה המוגדרת. כפי שאמר @Elhanan הגדלה של המגבלה לא בהכרח תעזור, יכול להיות שעבור קלט מסויים הביטוי הזה נכשל - כלומר עובד יותר מידי הרבה פעמים עד שהשאילתה תיתקע למשך שנתיים.

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

              מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

              בכל נושא אפשר ליצור קשר dovid@tchumim.com

              chagoldC תגובה 1 תגובה אחרונה
              3
              • chagoldC מנותק
                chagoldC מנותק
                chagold
                השיב לdovid ב נערך לאחרונה על ידי chagold
                #7

                @dovid כוונתך שאכתוב את הביטוי ככה?

                "\\[align=right\\]((.)*?)\\[\\/align\\]"
                
                dovidD תגובה 1 תגובה אחרונה
                0
                • dovidD מנותק
                  dovidD מנותק
                  dovid ניהול
                  השיב לchagold ב נערך לאחרונה על ידי
                  #8

                  @chagold כן (הסוגריים סביב הנקודה מיותרים, ואמורה להיות קבוצה 1 בלבד).

                  מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                  בכל נושא אפשר ליצור קשר dovid@tchumim.com

                  chagoldC תגובה 1 תגובה אחרונה
                  1
                  • chagoldC מנותק
                    chagoldC מנותק
                    chagold
                    השיב לdovid ב נערך לאחרונה על ידי chagold
                    #9

                    יש לי עכשיו שגיאה נוספת.

                    הקוד

                    UPDATE phpbb_posts set post_text = REPLACE(
                    
                    post_text,
                    REGEXP_SUBSTR(post_text, '\\<ALIGN align="(.*?)"(.*?)\\>(.*?)\\<\\/ALIGN\\>'),
                    REGEXP_REPLACE  ( REGEXP_SUBSTR(post_text, '\\<ALIGN align="(.*?)"(.*?)\\>(.*?)\\<\\/ALIGN\\>'),'^\\<ALIGN align="(.*?)"(.*?)\\>(.*?)\\<\\/ALIGN\\>', '\\2')
                        )
                    

                    השגיאה -

                     Warning: #1139 Regex error 'match limit exceeded'
                    
                    

                    (ג"כ רק בחלק מהרשומות).

                    תודה

                    ElhananE תגובה 1 תגובה אחרונה
                    0
                    • ElhananE מנותק
                      ElhananE מנותק
                      Elhanan
                      השיב לchagold ב נערך לאחרונה על ידי Elhanan
                      #10

                      @chagold לפי הבנתי, השגיאה נובעת שוב מתחביר שגוי.
                      לדעתי השגיאה נובעת מהגדרות ברירת מחדל של הספריה PCRE שנועדו ע"מ להגביל את השימוש בזיכרון או את זמן החישוב.
                      PCRE משתמש בפונקצייה match() וקורא לה בצורה רקורסיבית, ע"מ שלא תרוץ רקורסיה אין סופית, קבעו את הגבול match_limit שמגבילה את מספר הקריאות של הפונקציה. כמו את מגבלת הרקורסיה, גם כאן ניתן לשנות את המגבלה. כברירת מחדל הוא מוגבל ל10 מיליון קריאות וניתן לשנות אותה באמצעות הפונקצייה pcre_exec().
                      אבל כמו שכתבתי קודם, לשנות את המגבלה זה לא פיתרון, מגבלות הברירת מחדל לא קיימות סתם. אני מציע לבדוק שוב את התחביר ע"מ לאתר את שורש הבעיה.
                      יתכן שהבעיה קיימת מסיבות אחרות, ולאו דווקא בגלל הPCRE, אבל הבעיה זהה..

                      פורום איש את רעהו|חיתוך שירים|בלוג|מקצר קישורים|ביו

                      תגובה 1 תגובה אחרונה
                      5

                      בא תתחבר לדף היומי!
                      • התחברות

                      • אין לך חשבון עדיין? הרשמה

                      • התחברו או הירשמו כדי לחפש.
                      • פוסט ראשון
                        פוסט אחרון
                      0
                      • דף הבית
                      • קטגוריות
                      • פוסטים אחרונים
                      • משתמשים
                      • חיפוש
                      • חוקי הפורום