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

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

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

יש חלופה טובה/עדכנית לרקורסיה?

מתוזמן נעוץ נעול הועבר תכנות
20 פוסטים 8 כותבים 213 צפיות 7 עוקבים
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • E eido

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

    pcinfogmachP מנותק
    pcinfogmachP מנותק
    pcinfogmach
    כתב נערך לאחרונה על ידי pcinfogmach
    #6

    @eido
    במחילה
    מה בדיוק אתה מנסה לעושת שלוקח יותר מ-6 דקות זמן ריצה על ידי רקורסיה?
    ולמה החלטת שאי אפשר לעצור רקורסיה באמצע?

    גמ"ח מידע מחשבים ואופיס

    E תגובה 1 תגובה אחרונה
    2
    • dovidD מחובר
      dovidD מחובר
      dovid
      ניהול
      כתב נערך לאחרונה על ידי dovid
      #7

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

      • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
      • בכל נושא אפשר ליצור קשר dovid@tchumim.com
      E תגובה 1 תגובה אחרונה
      0
      • yossizY מנותק
        yossizY מנותק
        yossiz
        כתב נערך לאחרונה על ידי
        #8

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

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

        E תגובה 1 תגובה אחרונה
        4
        • E eido

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

          צבי-שצ מנותק
          צבי-שצ מנותק
          צבי-ש
          כתב נערך לאחרונה על ידי
          #9

          @eido כתב ביש חלופה טובה/עדכנית לרקורסיה?:

          לדוגמא למעבר על כל הקבצים בתיקיה על כל תיקיות המשנה שלה

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

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

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

          אם אני צודק בניחושים הנ״ל

          1 לא מומלץ, הם יכולים לחסום אותך (ימות המשיח), אין להם rate limit גלוי, אבל הם פתאום מחליטים לחסום אותך כשהם חושבים שהגזמת. (לחסום ברמת מערכת, לא ip של גוגל)

          2 אם למשל הקוד שלך מעביר קבצים חדשים שהשתנו, ואתה זוכר במשתנה בקוד שרצת כבר על שלוחות 1,2,3 ואתה באמצע 4.1.2 תוכל לשמור את זה לאיזה קובץ, ולהמשיך פעם הבאה מאותו מקום, אולי זה לא ייתן לך גיבוי כל הזמן, או להשלים אותו בכל ריצה, אבל ייתן לך משהו.

          כיף לגלות דברים חדשים.
          חוק ה-50-50-90: בכל פעם שיש סיכוי של 50-50 שמשהו יעבוד, יש סיכוי של 90 אחוז שהוא לא. מקור

          E תגובה 1 תגובה אחרונה
          2
          • pcinfogmachP pcinfogmach

            @eido
            במחילה
            מה בדיוק אתה מנסה לעושת שלוקח יותר מ-6 דקות זמן ריצה על ידי רקורסיה?
            ולמה החלטת שאי אפשר לעצור רקורסיה באמצע?

            E מנותק
            E מנותק
            eido
            כתב נערך לאחרונה על ידי eido
            #10

            @pcinfogmach כתב ביש חלופה טובה/עדכנית לרקורסיה?:

            @eido
            במחילה
            מה בדיוק אתה מנסה לעושת שלוקח יותר מ-6 דקות זמן ריצה על ידי רקורסיה?

            כפי שאמר @צבי-ש גיבוי לקוים בימות המשיח, מי שהיה שם בתקופה האחרונה יודע למה...

            ולמה החלטת שאי אפשר לעצור רקורסיה באמצע?

            ככה נראה לי בהגיון... כי הרי רקורסיה זה פונקציה שקוראת לעצמה וככה מתקדמת, אם יש 4 תיקיות ובתוך כל תיקיה יש 4 תיקיות ותתי תקיות אז אם עצרנו ב2 -> 3, אז נשארו את 3 ו4 -> כל שלוחותיהן ו2 -> 3 מאיפה שעצרנו הן בתת תיקיות והן בתיקיות עצמן, במיוחד אם יש עוד פעולות על התיקיות שצריכות להתבצע רק אחרי מעבר על כל התיקיה, או שכל קובץ צורך פעולה אחרת.

            תגובה 1 תגובה אחרונה
            0
            • dovidD dovid

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

              E מנותק
              E מנותק
              eido
              כתב נערך לאחרונה על ידי eido
              #11

              @dovid כתב ביש חלופה טובה/עדכנית לרקורסיה?:

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

              אני לא מבין כתבתי בפירוש

              אבל נשמע שהיום זה פחות מומלץ

              אני לא יודע אני שואל...

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

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

              מחילה, לא רואה בעיה במה שאמרתי.

              שוב ושוב נהיה מצב שבמקום לענות לך מתחילים לדון על הנחות היסוד שלך הנסתרות/הנגלות.

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

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

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

                E מנותק
                E מנותק
                eido
                כתב נערך לאחרונה על ידי eido
                #12

                @yossiz נכון מאוד, אבל לפעמים בהתחלה מתלהבים משיטה מסויימת ואז מגלים שיש לה קצת חסרונות פה ושם ומגיע איזה צוות חוקרים/מפתחים שמגלה שיטה יותר טובה, התכנות מלא בדוגמאות כאלו:
                ירושות של כמה "דורות".
                תבניות למיניהם.
                פעם הפוקנציות היו רגילות ואז גילו את הגנריות.
                סינכרוני מול אסינכרוני.
                wep מול wpa
                random פשוט שהיום (וכבר מזמן) ניתן לחזות בדיוק מה הוא יהיה ואף להכריחו ליצור ערך מסוים לעמות שיטות random כיום.
                ועוד הרבה בכל סוגי המקצועות (כמו gsm->umts->lte->5g).
                בעצם כמעט כל שפת תכנות טוענת שהיא יותר טובה מהקודמת.
                השיטות שהיום "in" מחר כבר "out", מעין מה שנקרא buzz word.

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

                תגובה 1 תגובה אחרונה
                1
                • צבי-שצ צבי-ש

                  @eido כתב ביש חלופה טובה/עדכנית לרקורסיה?:

                  לדוגמא למעבר על כל הקבצים בתיקיה על כל תיקיות המשנה שלה

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

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

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

                  אם אני צודק בניחושים הנ״ל

                  1 לא מומלץ, הם יכולים לחסום אותך (ימות המשיח), אין להם rate limit גלוי, אבל הם פתאום מחליטים לחסום אותך כשהם חושבים שהגזמת. (לחסום ברמת מערכת, לא ip של גוגל)

                  2 אם למשל הקוד שלך מעביר קבצים חדשים שהשתנו, ואתה זוכר במשתנה בקוד שרצת כבר על שלוחות 1,2,3 ואתה באמצע 4.1.2 תוכל לשמור את זה לאיזה קובץ, ולהמשיך פעם הבאה מאותו מקום, אולי זה לא ייתן לך גיבוי כל הזמן, או להשלים אותו בכל ריצה, אבל ייתן לך משהו.

                  E מנותק
                  E מנותק
                  eido
                  כתב נערך לאחרונה על ידי eido
                  #13

                  @צבי-ש כתב ביש חלופה טובה/עדכנית לרקורסיה?:

                  @eido כתב ביש חלופה טובה/עדכנית לרקורסיה?:

                  לדוגמא למעבר על כל הקבצים בתיקיה על כל תיקיות המשנה שלה

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

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

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

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

                  אין עליך 👍

                  אם אני צודק בניחושים הנ״ל

                  1 לא מומלץ, הם יכולים לחסום אותך (ימות המשיח), אין להם rate limit גלוי, אבל הם פתאום מחליטים לחסום אותך כשהם חושבים שהגזמת. (לחסום ברמת מערכת, לא ip של גוגל)

                  לכן אנ מגביל את זה ברמת הסקריפט לטריגרים לפי מספר ימים, לא אמור להוות בעיה.

                  2 אם למשל הקוד שלך מעביר קבצים חדשים שהשתנו, ואתה זוכר במשתנה בקוד שרצת כבר על שלוחות 1,2,3 ואתה באמצע 4.1.2 תוכל לשמור את זה לאיזה קובץ, ולהמשיך פעם הבאה מאותו מקום, אולי זה לא ייתן לך גיבוי כל הזמן, או להשלים אותו בכל ריצה, אבל ייתן לך משהו.

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

                  צבי-שצ תגובה 1 תגובה אחרונה
                  0
                  • E eido

                    @צבי-ש כתב ביש חלופה טובה/עדכנית לרקורסיה?:

                    @eido כתב ביש חלופה טובה/עדכנית לרקורסיה?:

                    לדוגמא למעבר על כל הקבצים בתיקיה על כל תיקיות המשנה שלה

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

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

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

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

                    אין עליך 👍

                    אם אני צודק בניחושים הנ״ל

                    1 לא מומלץ, הם יכולים לחסום אותך (ימות המשיח), אין להם rate limit גלוי, אבל הם פתאום מחליטים לחסום אותך כשהם חושבים שהגזמת. (לחסום ברמת מערכת, לא ip של גוגל)

                    לכן אנ מגביל את זה ברמת הסקריפט לטריגרים לפי מספר ימים, לא אמור להוות בעיה.

                    2 אם למשל הקוד שלך מעביר קבצים חדשים שהשתנו, ואתה זוכר במשתנה בקוד שרצת כבר על שלוחות 1,2,3 ואתה באמצע 4.1.2 תוכל לשמור את זה לאיזה קובץ, ולהמשיך פעם הבאה מאותו מקום, אולי זה לא ייתן לך גיבוי כל הזמן, או להשלים אותו בכל ריצה, אבל ייתן לך משהו.

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

                    צבי-שצ מנותק
                    צבי-שצ מנותק
                    צבי-ש
                    כתב נערך לאחרונה על ידי
                    #14

                    @eido כתב ביש חלופה טובה/עדכנית לרקורסיה?:

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

                    0

                    אז לפני שאתה מתחיל את הסקריפט, תספור זמנים ואם עובר 5 ומשהו דקות, תסיים עיבוד לקובץ הנוכחי, תשמור תמונת מצב נוכחית באיזה json ותרים משם מחדש.
                    אולי תעשה קריאה לעוד סקריפט שאותו תפעיל עם בקשת get שיתחיל מאותו מקום, וישאב את הjson או יקבל בפרמטרים את הנתיב שהוא אוחז בו או לא יודע מה, אולי ב bady את כל התמונת מצב איפה אתה אוחז ומה עשית, וככה כן תוכל להמשיך עד לגיבוי מלא, אבל זה דרך עקומה ללכת, יותר הגיוני להפעיל את זה פשוט משרת רגיל ואמיתי עם קוד חסכוני ויעיל כמה שיותר, ואם ייקח שעתיים, שייקח שעתיים, גיבוי עלול לקחת זמן

                    כיף לגלות דברים חדשים.
                    חוק ה-50-50-90: בכל פעם שיש סיכוי של 50-50 שמשהו יעבוד, יש סיכוי של 90 אחוז שהוא לא. מקור

                    E תגובה 1 תגובה אחרונה
                    0
                    • צבי-שצ צבי-ש

                      @eido כתב ביש חלופה טובה/עדכנית לרקורסיה?:

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

                      0

                      אז לפני שאתה מתחיל את הסקריפט, תספור זמנים ואם עובר 5 ומשהו דקות, תסיים עיבוד לקובץ הנוכחי, תשמור תמונת מצב נוכחית באיזה json ותרים משם מחדש.
                      אולי תעשה קריאה לעוד סקריפט שאותו תפעיל עם בקשת get שיתחיל מאותו מקום, וישאב את הjson או יקבל בפרמטרים את הנתיב שהוא אוחז בו או לא יודע מה, אולי ב bady את כל התמונת מצב איפה אתה אוחז ומה עשית, וככה כן תוכל להמשיך עד לגיבוי מלא, אבל זה דרך עקומה ללכת, יותר הגיוני להפעיל את זה פשוט משרת רגיל ואמיתי עם קוד חסכוני ויעיל כמה שיותר, ואם ייקח שעתיים, שייקח שעתיים, גיבוי עלול לקחת זמן

                      E מנותק
                      E מנותק
                      eido
                      כתב נערך לאחרונה על ידי
                      #15

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

                      תגובה 1 תגובה אחרונה
                      0
                      • chvC מנותק
                        chvC מנותק
                        chv
                        כתב נערך לאחרונה על ידי chv
                        #16

                        אני מגיב כאן כי השרשור השני נעול.
                        אני אולי לא לגמרי מעודכן בצרכים אבל אם אני מבין נכון אתה מתעסק עם google drive api ומתפעל אותו על גוגל סקריפט. (זה נכון?)
                        יש משהו מסוים במבנה הקבצים בגוגל דרייב זה שהוא flat כלומר אין עץ. פשוט לכל קובץ מסוג תיקייה יש גם ילדים files שצריך לעשות query קודם על התיקייה עצמה לקבל את הfiles שלה ואז עוד query על כל אחד מהילדים שהוא מסוג תיקייה לקבל את הfiles שלו וכן הלאה. זה הבעיה. (ויכול להיות שמה שאנשים פה הגיבו לך איך שהגיבו זה בגלל שתי סיבות: הם לא מכירים ואין להם ניסיון ספציפית עם גוגל דרייב api, וגם שהבעיה לא באמת הובהרה כיאות על ידך)
                        עדיף שתעלה את הקוד שלך ויהיה אפשר להתייחס לבעיה בשורשה ובאופן יותר מדויק.
                        יכול להיות מאוד שיש פתרונות שקשורים לדרך השאילתא לגוגל דרייב api.

                        עריכה: בשביל מי שלא מכיר את גוגל דרייב api, אני לדוגמא יש לי לא מעט היכרות איתו ועם מגבלות שלו. לדוגמא אם רוצים לעשות חיפוש רקורסיבי תחת תיקייה ספציפית זה ברמת הלא אפשרי (אפשרי רק בצורה ממש לא יעילה, אי אפשר לקרוא לזה אפשרי. לעשות שאילתות כפול מספר התיקיות שנמצאות תחת התיקייה הספציפית) לפחות עד כמה שאני ניסתי וחקרתי. אם למישהו יש פיתרון שעובד - נפתח על זה שרשור נוסף (ה'פיתרון' הכי הגיוני שאני מכיר הוא כזה בערך: לבצע חיפוש (גלובלי) ואז על כל אחת מהתוצאות לעשות רקורסיה לקבל את הparent ואז את הparent של הparent וחוזר חלילה, ולעצור אם הparentId שהתקבל = הid של התיקייה הספציפית שבה אנחנו רוצים לחפש.. אם כך אנו כוללים את התוצאה הזו בתוצאות הוולידיות).
                        לגוגל עצמה נראה שיש איזה api פנימי שעובד (צריך להבין איך הוא עובד כי באמת מצורת מבנה הקבצים שבה גוגל דרייב משתמשת זה מאוד מקשה לתמוך בכזה פיצ'ר) - אפשר להגדיר parent:id כאופרטור בחיפוש של דרייב וזה מחפש רקורסיבית בתוכו.
                        במילים אחרות: אין path נייטיבי בגוגל דרייב, לפחות לא בapi. לכן אין באמת רקורסיה נייטיבית של עץ קבצים. לכן יש אתגרים.
                        במילים נוספות: למי שתוהה, לone drive כן יש path וכן אפשר לחפש רקורסיבית בתוך תיקייה. דרך הapi.

                        בלוג | מייל

                        E dovidD 2 תגובות תגובה אחרונה
                        3
                        • chvC chv

                          אני מגיב כאן כי השרשור השני נעול.
                          אני אולי לא לגמרי מעודכן בצרכים אבל אם אני מבין נכון אתה מתעסק עם google drive api ומתפעל אותו על גוגל סקריפט. (זה נכון?)
                          יש משהו מסוים במבנה הקבצים בגוגל דרייב זה שהוא flat כלומר אין עץ. פשוט לכל קובץ מסוג תיקייה יש גם ילדים files שצריך לעשות query קודם על התיקייה עצמה לקבל את הfiles שלה ואז עוד query על כל אחד מהילדים שהוא מסוג תיקייה לקבל את הfiles שלו וכן הלאה. זה הבעיה. (ויכול להיות שמה שאנשים פה הגיבו לך איך שהגיבו זה בגלל שתי סיבות: הם לא מכירים ואין להם ניסיון ספציפית עם גוגל דרייב api, וגם שהבעיה לא באמת הובהרה כיאות על ידך)
                          עדיף שתעלה את הקוד שלך ויהיה אפשר להתייחס לבעיה בשורשה ובאופן יותר מדויק.
                          יכול להיות מאוד שיש פתרונות שקשורים לדרך השאילתא לגוגל דרייב api.

                          עריכה: בשביל מי שלא מכיר את גוגל דרייב api, אני לדוגמא יש לי לא מעט היכרות איתו ועם מגבלות שלו. לדוגמא אם רוצים לעשות חיפוש רקורסיבי תחת תיקייה ספציפית זה ברמת הלא אפשרי (אפשרי רק בצורה ממש לא יעילה, אי אפשר לקרוא לזה אפשרי. לעשות שאילתות כפול מספר התיקיות שנמצאות תחת התיקייה הספציפית) לפחות עד כמה שאני ניסתי וחקרתי. אם למישהו יש פיתרון שעובד - נפתח על זה שרשור נוסף (ה'פיתרון' הכי הגיוני שאני מכיר הוא כזה בערך: לבצע חיפוש (גלובלי) ואז על כל אחת מהתוצאות לעשות רקורסיה לקבל את הparent ואז את הparent של הparent וחוזר חלילה, ולעצור אם הparentId שהתקבל = הid של התיקייה הספציפית שבה אנחנו רוצים לחפש.. אם כך אנו כוללים את התוצאה הזו בתוצאות הוולידיות).
                          לגוגל עצמה נראה שיש איזה api פנימי שעובד (צריך להבין איך הוא עובד כי באמת מצורת מבנה הקבצים שבה גוגל דרייב משתמשת זה מאוד מקשה לתמוך בכזה פיצ'ר) - אפשר להגדיר parent:id כאופרטור בחיפוש של דרייב וזה מחפש רקורסיבית בתוכו.
                          במילים אחרות: אין path נייטיבי בגוגל דרייב, לפחות לא בapi. לכן אין באמת רקורסיה נייטיבית של עץ קבצים. לכן יש אתגרים.
                          במילים נוספות: למי שתוהה, לone drive כן יש path וכן אפשר לחפש רקורסיבית בתוך תיקייה. דרך הapi.

                          E מנותק
                          E מנותק
                          eido
                          כתב נערך לאחרונה על ידי
                          #17

                          @chv הקוד שלי הוא כזה:
                          לשחזור:

                          function getAllFilesAndDiresToUpload(path, parentFolder)
                          {
                            Logger.log("מתחיל למצוא קבצים");
                            Logger.log("התיקיה היא: " + parentFolder.getName());
                            let urls = [], urlsBigFiles = [];
                            if(path!=""){
                            let tempCreateExtUrl = createExtUrl.replace("{token}", token);
                            tempCreateExtUrl += path;
                            Logger.log("יוצר תיקיה: " + path);
                                let res = UrlFetchApp.fetch(tempCreateExtUrl, {muteHttpExceptions: true});
                                let data = JSON.parse(res.getContentText());
                          
                            if (!data || data.responseStatus !== "OK") {
                              sheet.appendRow(["איראה שגיאה", data.message]);
                            Logger.log("שגיאה");
                            return HtmlService.createHtmlOutput("שגיאה");
                            }
                          
                            }
                            let files = parentFolder.getFiles(); 
                                while(files.hasNext())
                                {
                                  let file = files.next(); 
                                  if (file.getSize() > 52428800) {
                                    urlsBigFiles.push(file);
                                  }
                                  else{
                                  urls.push(file);
                                  Logger.log("נמצא קובץ: " + file.getName());
                                  }
                                }
                          
                                uploadFiles(urls, path);
                          
                          let folders = parentFolder.getFolders();
                                 while(folders.hasNext())
                                {
                                  let folder = folders.next();
                                  getAllFilesAndDiresToUpload(path+"/"+folder.getName() ,folder);
                                }
                          
                          }
                          

                          לגיבוי

                          function getAllFilesAndDires1(path, parentFolder){
                            let filesTodownload=[];
                            
                            let tempGetDirDataUrl = getDirDataUrl.replace("{token}", token);
                            tempGetDirDataUrl +=  path;
                            let res = UrlFetchApp.fetch(tempGetDirDataUrl, {muteHttpExceptions: true});
                            let data = JSON.parse(res.getContentText());
                          
                            if (!data || data.responseStatus !== "OK") {
                              sheet.appendRow(["איראה שגיאה", data.message]);
                            Logger.log("שגיאה");
                            return HtmlService.createHtmlOutput("שגיאה");
                            }
                          
                            if (data.files && data.files.length)
                            {
                              data.files.forEach(file => {
                                  let tempGetFileUrl = getFileUrl.replace("{token}", token) + encodeURIComponent(file.what);
                                  filesTodownload.push([file.name,tempGetFileUrl]);
                          
                                  if(file.meta != null && !(file.what.endsWith(".ygmr")))
                                  {
                                    tempGetFileUrl = getFileUrl.replace("{token}", token) + encodeURIComponent(file.what.replace(/\.[^/.]+$/, ".txt"));
                                    filesTodownload.push([file.name.replace(/\.[^/.]+$/, ".txt") ,tempGetFileUrl]);
                                  }
                              })
                            }
                          
                            if (data.ini && data.ini.length)
                            {
                              data.ini.forEach(ini => {
                              let tempGetFileUrl = getFileUrl.replace("{token}", token) + encodeURIComponent(ini.what) 
                              filesTodownload.push([ini.name,tempGetFileUrl]);
                              })
                            }
                          
                            DownloadFile(filesTodownload, parentFolder);
                          
                              if (data.dirs && data.dirs.length)
                            {
                              data.dirs.forEach(dir => {
                                if (dir.what !== "ivr2:/Trash"){
                                const subFolder = parentFolder.createFolder(dir.name);
                                getAllFilesAndDires1(dir.what, subFolder);
                                }
                              })
                            }
                          
                          }
                          

                          כיום אני עובד על קוד כזה (עוד לא בדקתי אותו, מאמין שיש שגיאות)

                          let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("data");
                          let dirInDataIndex = Number(PropertiesService.getScriptProperties().getProperty("dirInDataIndex"));
                          let dirIndex = Number(PropertiesService.getScriptProperties().getProperty("dirIndex"));
                          let dirList = sheet.getRange(1,1,sheet.getLastRow()-1,2).getValues();
                          const startTime = Date.now();
                          
                          function getDirs(){
                          while (dirInDataIndex<dirList.length)
                          {
                            let newDirList=[];
                              let tempGetDirDataUrl = getDirDataUrl.replace("{token}", token);
                                    tempGetDirDataUrl +=  dirList[dirInDataIndex][0];
                                    dirInDataIndex++;
                                    let res = UrlFetchApp.fetch(tempGetDirDataUrl, {muteHttpExceptions: true});
                                    let data = JSON.parse(res.getContentText());
                          
                                    if (!data || data.responseStatus !== "OK") {
                                    sheet.appendRow(["איראה שגיאה", data.message]);
                                    Logger.log("שגיאה");
                                    return HtmlService.createHtmlOutput("שגיאה");
                                    }  
                          
                                    if (data.dirs && data.dirs.length)
                                    {
                                      for(let i = dirIndex ; i < data.dirs.length ; i++){
                                      const subFolder = parentFolder.createFolder(data.dirs[i].name)
                                      newDirList.push([data.dirs[i].name, subFolder.getId()]);
                                      if ((Date.now() - startTime) > 300000)
                                        {
                                          PropertiesService.getScriptProperties().setProperty("dirInDataIndex",dirInDataIndex);
                                          PropertiesService.getScriptProperties().setProperty("dirIndex", i+1);
                                          sheet.getRange(dirList.length,1,newDirList.length,2).setValues(newDirList);
                                          ScriptApp.newTrigger("getDirs").timeBased().after(10 * 1000).create();
                                          return;
                                        }
                                      }
                                      PropertiesService.getScriptProperties().setProperty("dirIndex", 0);
                                    }
                            }
                            ScriptApp.getProjectTriggers().forEach(trigger => {
                              if (trigger.getHandlerFunction() == "getDirs")
                              {ScriptApp.deleteTrigger(trigger);}
                              });
                          }
                          
                          תגובה 1 תגובה אחרונה
                          0
                          • chvC chv

                            אני מגיב כאן כי השרשור השני נעול.
                            אני אולי לא לגמרי מעודכן בצרכים אבל אם אני מבין נכון אתה מתעסק עם google drive api ומתפעל אותו על גוגל סקריפט. (זה נכון?)
                            יש משהו מסוים במבנה הקבצים בגוגל דרייב זה שהוא flat כלומר אין עץ. פשוט לכל קובץ מסוג תיקייה יש גם ילדים files שצריך לעשות query קודם על התיקייה עצמה לקבל את הfiles שלה ואז עוד query על כל אחד מהילדים שהוא מסוג תיקייה לקבל את הfiles שלו וכן הלאה. זה הבעיה. (ויכול להיות שמה שאנשים פה הגיבו לך איך שהגיבו זה בגלל שתי סיבות: הם לא מכירים ואין להם ניסיון ספציפית עם גוגל דרייב api, וגם שהבעיה לא באמת הובהרה כיאות על ידך)
                            עדיף שתעלה את הקוד שלך ויהיה אפשר להתייחס לבעיה בשורשה ובאופן יותר מדויק.
                            יכול להיות מאוד שיש פתרונות שקשורים לדרך השאילתא לגוגל דרייב api.

                            עריכה: בשביל מי שלא מכיר את גוגל דרייב api, אני לדוגמא יש לי לא מעט היכרות איתו ועם מגבלות שלו. לדוגמא אם רוצים לעשות חיפוש רקורסיבי תחת תיקייה ספציפית זה ברמת הלא אפשרי (אפשרי רק בצורה ממש לא יעילה, אי אפשר לקרוא לזה אפשרי. לעשות שאילתות כפול מספר התיקיות שנמצאות תחת התיקייה הספציפית) לפחות עד כמה שאני ניסתי וחקרתי. אם למישהו יש פיתרון שעובד - נפתח על זה שרשור נוסף (ה'פיתרון' הכי הגיוני שאני מכיר הוא כזה בערך: לבצע חיפוש (גלובלי) ואז על כל אחת מהתוצאות לעשות רקורסיה לקבל את הparent ואז את הparent של הparent וחוזר חלילה, ולעצור אם הparentId שהתקבל = הid של התיקייה הספציפית שבה אנחנו רוצים לחפש.. אם כך אנו כוללים את התוצאה הזו בתוצאות הוולידיות).
                            לגוגל עצמה נראה שיש איזה api פנימי שעובד (צריך להבין איך הוא עובד כי באמת מצורת מבנה הקבצים שבה גוגל דרייב משתמשת זה מאוד מקשה לתמוך בכזה פיצ'ר) - אפשר להגדיר parent:id כאופרטור בחיפוש של דרייב וזה מחפש רקורסיבית בתוכו.
                            במילים אחרות: אין path נייטיבי בגוגל דרייב, לפחות לא בapi. לכן אין באמת רקורסיה נייטיבית של עץ קבצים. לכן יש אתגרים.
                            במילים נוספות: למי שתוהה, לone drive כן יש path וכן אפשר לחפש רקורסיבית בתוך תיקייה. דרך הapi.

                            dovidD מחובר
                            dovidD מחובר
                            dovid
                            ניהול
                            כתב נערך לאחרונה על ידי dovid
                            #18

                            @chv כתב ביש חלופה טובה/עדכנית לרקורסיה?:

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

                            אני חוסך לך לגלול למעלה, ההודעות שלו היו:

                            @eido כתב ביש חלופה טובה/עדכנית לרקורסיה?:

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

                            @eido כתב במעבר על תיקיות ותתי תיקיות על כל קבציהן בלי רקורסיה:

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

                            אחרי שני ההודעות-נושאים האלה, עם הכותרות שלהן, עדיין נשארה שאלה למה הגיבו "כמו שהגיבו"?
                            השאלה עליך...

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

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

                              תגובה 1 תגובה אחרונה
                              -1
                              • dovidD dovid

                                @chv כתב ביש חלופה טובה/עדכנית לרקורסיה?:

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

                                אני חוסך לך לגלול למעלה, ההודעות שלו היו:

                                @eido כתב ביש חלופה טובה/עדכנית לרקורסיה?:

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

                                @eido כתב במעבר על תיקיות ותתי תיקיות על כל קבציהן בלי רקורסיה:

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

                                אחרי שני ההודעות-נושאים האלה, עם הכותרות שלהן, עדיין נשארה שאלה למה הגיבו "כמו שהגיבו"?
                                השאלה עליך...

                                chvC מנותק
                                chvC מנותק
                                chv
                                כתב נערך לאחרונה על ידי
                                #20

                                @dovid הכל טוב ברור לי וגם כתבתי, שהבעיה ממש לא הובהרה כיאות.

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

                                @י.פל. כתב ביש חלופה טובה/עדכנית לרקורסיה?:

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

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

                                בלוג | מייל

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


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

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

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