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

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

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

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

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

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

     Warning: #1139 Regex error 'recursion limit exceeded'
    

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

    תודה

    yossizY ElhananE 2 תגובות תגובה אחרונה
    0
    • chagoldC chagold

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

       Warning: #1139 Regex error 'recursion limit exceeded'
      

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

      תודה

      yossizY מנותק
      yossizY מנותק
      yossiz
      כתב ב נערך לאחרונה על ידי
      #2

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

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

      chagoldC תגובה 1 תגובה אחרונה
      0
      • chagoldC chagold

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

         Warning: #1139 Regex error 'recursion limit exceeded'
        

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

        תודה

        ElhananE מנותק
        ElhananE מנותק
        Elhanan
        כתב ב נערך לאחרונה על ידי Elhanan
        #3

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

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

        chagoldC תגובה 1 תגובה אחרונה
        8
        • yossizY yossiz

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

          chagoldC מנותק
          chagoldC מנותק
          chagold
          כתב ב נערך לאחרונה על ידי
          #4

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

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

          10.5.17-MariaDB-cll-lve - MariaDB Server
          
          תגובה 1 תגובה אחרונה
          0
          • ElhananE Elhanan

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

            chagoldC מנותק
            chagoldC מנותק
            chagold
            כתב ב נערך לאחרונה על ידי
            #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
            • chagoldC chagold

              @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 מנותק
              dovidD מנותק
              dovid
              ניהול
              כתב ב נערך לאחרונה על ידי
              #6

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

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

              • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
              • בכל נושא אפשר ליצור קשר dovid@tchumim.com
              chagoldC תגובה 1 תגובה אחרונה
              3
              • dovidD dovid

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

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

                chagoldC מנותק
                chagoldC מנותק
                chagold
                כתב ב נערך לאחרונה על ידי chagold
                #7

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

                "\\[align=right\\]((.)*?)\\[\\/align\\]"
                
                dovidD תגובה 1 תגובה אחרונה
                0
                • chagoldC chagold

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

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

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

                  • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                  • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                  chagoldC תגובה 1 תגובה אחרונה
                  1
                  • dovidD dovid

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

                    chagoldC מנותק
                    chagoldC מנותק
                    chagold
                    כתב ב נערך לאחרונה על ידי 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
                    • chagoldC chagold

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

                      הקוד

                      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 מנותק
                      ElhananE מנותק
                      Elhanan
                      כתב ב נערך לאחרונה על ידי Elhanan
                      #10

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

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

                      תגובה 1 תגובה אחרונה
                      5
                      תגובה
                      • תגובה כנושא
                      התחברו כדי לפרסם תגובה
                      • מהישן לחדש
                      • מהחדש לישן
                      • הכי הרבה הצבעות


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

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

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