יש חלופה טובה/עדכנית לרקורסיה?
-
כשהתחלתי ללמוד תכנות רקורסיה זה היה "הדבר", אבל נשמע שהיום זה פחות מומלץ, יש חלופה אחרת יותר טובה? מה מקובל היום? לדוגמא למעבר על כל הקבצים בתיקיה על כל תיקיות המשנה שלה, מה מומלץ? לכאורה רקורסיה זה הפתרון...
-
@meir-lamdan בזבזני, לא ניתן לעצור באמצע אם צריך ולהמשיך אח"כ.
-
כשהתחלתי ללמוד תכנות רקורסיה זה היה "הדבר", אבל נשמע שהיום זה פחות מומלץ, יש חלופה אחרת יותר טובה? מה מקובל היום? לדוגמא למעבר על כל הקבצים בתיקיה על כל תיקיות המשנה שלה, מה מומלץ? לכאורה רקורסיה זה הפתרון...
@eido כתב ביש חלופה טובה/עדכנית לרקורסיה?:
מעבר על כל הקבצים בתיקיה על כל תיקיות המשנה שלה
באיזה שפה?
בnodejs יש אפשרות מבנית לחיפוש רקורסיבי https://nodejs.org/api/fs.html#fspromisesreaddirpath-options
-
@eido כתב ביש חלופה טובה/עדכנית לרקורסיה?:
מעבר על כל הקבצים בתיקיה על כל תיקיות המשנה שלה
באיזה שפה?
בnodejs יש אפשרות מבנית לחיפוש רקורסיבי https://nodejs.org/api/fs.html#fspromisesreaddirpath-options
@meir-lamdan גם באופן כללי אבל עכשיו מה שעומד מולי זה google script שם הזמן ריצה מוגבל ל6 דקות שזה ממש מעט לרקורסיה.
-
כשהתחלתי ללמוד תכנות רקורסיה זה היה "הדבר", אבל נשמע שהיום זה פחות מומלץ, יש חלופה אחרת יותר טובה? מה מקובל היום? לדוגמא למעבר על כל הקבצים בתיקיה על כל תיקיות המשנה שלה, מה מומלץ? לכאורה רקורסיה זה הפתרון...
@eido
במחילה
מה בדיוק אתה מנסה לעושת שלוקח יותר מ-6 דקות זמן ריצה על ידי רקורסיה?
ולמה החלטת שאי אפשר לעצור רקורסיה באמצע? -
קשקוש מוחלט.
@eido הבעיה המרכזית שלך היא ש"אתה יודע".
בין אם זה בתום לב או שזה תחבולה כדי שיתייחסו אליך יותר ברצינות או יותר יעזרו לך,
בשני המקרים זה פוגע רק בך.
כי לעונים נמאס ממישהו ש"יודע".
שוב ושוב נהיה מצב שבמקום לענות לך מתחילים לדון על הנחות היסוד שלך הנסתרות/הנגלות. -
כשהתחלתי ללמוד תכנות רקורסיה זה היה "הדבר", אבל נשמע שהיום זה פחות מומלץ, יש חלופה אחרת יותר טובה? מה מקובל היום? לדוגמא למעבר על כל הקבצים בתיקיה על כל תיקיות המשנה שלה, מה מומלץ? לכאורה רקורסיה זה הפתרון...
@eido כתב ביש חלופה טובה/עדכנית לרקורסיה?:
לדוגמא למעבר על כל הקבצים בתיקיה על כל תיקיות המשנה שלה
כמו שאמרו לך בפוסטים קודמים, אפשר לעצור רקורסיה כמובן
וזה פיתרון מעולה כשצריך אותו ויודעים איך ולמה להשתמש איתו.אני לא ייכנס כל כך למה אתה רוצה לעשות עם גוגל סקריפט, ואיך הגעת למצב שאתה יודע שיש לו לימיט של 6 דקות...
אני מנחש מההיכרות איתך שזה מדבר על גיבוי תיקיות של ימות המשיח לדרייב / משו כזה ואתה רץ ברקוריסה על ימות המשיח.
אם אני צודק בניחושים הנ״ל
1 לא מומלץ, הם יכולים לחסום אותך (ימות המשיח), אין להם rate limit גלוי, אבל הם פתאום מחליטים לחסום אותך כשהם חושבים שהגזמת. (לחסום ברמת מערכת, לא ip של גוגל)
2 אם למשל הקוד שלך מעביר קבצים חדשים שהשתנו, ואתה זוכר במשתנה בקוד שרצת כבר על שלוחות 1,2,3 ואתה באמצע 4.1.2 תוכל לשמור את זה לאיזה קובץ, ולהמשיך פעם הבאה מאותו מקום, אולי זה לא ייתן לך גיבוי כל הזמן, או להשלים אותו בכל ריצה, אבל ייתן לך משהו.
-
@eido
במחילה
מה בדיוק אתה מנסה לעושת שלוקח יותר מ-6 דקות זמן ריצה על ידי רקורסיה?
ולמה החלטת שאי אפשר לעצור רקורסיה באמצע?@pcinfogmach כתב ביש חלופה טובה/עדכנית לרקורסיה?:
@eido
במחילה
מה בדיוק אתה מנסה לעושת שלוקח יותר מ-6 דקות זמן ריצה על ידי רקורסיה?כפי שאמר @צבי-ש גיבוי לקוים בימות המשיח, מי שהיה שם בתקופה האחרונה יודע למה...
ולמה החלטת שאי אפשר לעצור רקורסיה באמצע?
ככה נראה לי בהגיון... כי הרי רקורסיה זה פונקציה שקוראת לעצמה וככה מתקדמת, אם יש 4 תיקיות ובתוך כל תיקיה יש 4 תיקיות ותתי תקיות אז אם עצרנו ב2 -> 3, אז נשארו את 3 ו4 -> כל שלוחותיהן ו2 -> 3 מאיפה שעצרנו הן בתת תיקיות והן בתיקיות עצמן, במיוחד אם יש עוד פעולות על התיקיות שצריכות להתבצע רק אחרי מעבר על כל התיקיה, או שכל קובץ צורך פעולה אחרת.
-
קשקוש מוחלט.
@eido הבעיה המרכזית שלך היא ש"אתה יודע".
בין אם זה בתום לב או שזה תחבולה כדי שיתייחסו אליך יותר ברצינות או יותר יעזרו לך,
בשני המקרים זה פוגע רק בך.
כי לעונים נמאס ממישהו ש"יודע".
שוב ושוב נהיה מצב שבמקום לענות לך מתחילים לדון על הנחות היסוד שלך הנסתרות/הנגלות.@dovid כתב ביש חלופה טובה/עדכנית לרקורסיה?:
קשקוש מוחלט.
@eido הבעיה המרכזית שלך היא ש"אתה יודע".
בין אם זה בתום לב או שזה תחבולה כדי שיתייחסו אליך יותר ברצינות או יותר יעזרו לך,
בשני המקרים זה פוגע רק בך.
כי לעונים נמאס ממישהו ש"יודע".אני לא מבין כתבתי בפירוש
אבל נשמע שהיום זה פחות מומלץ
אני לא יודע אני שואל...
הדברים היחידים שאני יודע הם שכשהתחלתי ללמוד, רקורסיה זה היה הדבר... אז התלהבו מזה כי זה חסך קוד מסורבל והצליחו להגיע ללמידת מכונה בעזרת זה, זה כל מה שטענתי שאני יודע...
וגם שרקורסיה זה בזבזני כי הוא שומר הרבה דברים בזכרון - מעצם היותה פונקציה שקוראת לעצמה שוב ושוב ושוב, ובמקומות שאתה לא יכול להרשות לעצמך להתפרע עם זכרון זה בהחלט בעיה, כמו גוגל סקריפט ומיקרו בקרים שיצא לי לא מעט לתכנת, שם אין מקום לרקורסיה, רק במקרים חריגים. לכל הדעות רקורסיה זו שיטה טובה ,אך בזבזנית.אמת, בטעות הכללתי את כל הרקורסיות במקרה שלי, שלא סביר לי שאפשר או נכון לעצור בו (למרות שבאמת ובתמים חשבתי שא"א לעצור רקורסיה ולהמשיך מאותו המקום).
מחילה, לא רואה בעיה במה שאמרתי.
שוב ושוב נהיה מצב שבמקום לענות לך מתחילים לדון על הנחות היסוד שלך הנסתרות/הנגלות.
לכולנו יש הנחות יסוד מוטעות, ככה בני האדם פועלים.
בשביל זה אני שואל... -
רקורסיה זה לא משהו שהולך לפי רוח הזמן, שהיום הוא פופולארי ומחר לא, זה מושג/טכניקה יסודי במדעי המחשב שצריך לדעת מתי ואיך להשתמש בו.
@yossiz נכון מאוד, אבל לפעמים בהתחלה מתלהבים משיטה מסויימת ואז מגלים שיש לה קצת חסרונות פה ושם ומגיע איזה צוות חוקרים/מפתחים שמגלה שיטה יותר טובה, התכנות מלא בדוגמאות כאלו:
ירושות של כמה "דורות".
תבניות למיניהם.
פעם הפוקנציות היו רגילות ואז גילו את הגנריות.
סינכרוני מול אסינכרוני.
wep מול wpa
random פשוט שהיום (וכבר מזמן) ניתן לחזות בדיוק מה הוא יהיה ואף להכריחו ליצור ערך מסוים לעמות שיטות random כיום.
ועוד הרבה בכל סוגי המקצועות (כמו gsm->umts->lte->5g).
בעצם כמעט כל שפת תכנות טוענת שהיא יותר טובה מהקודמת.
השיטות שהיום "in" מחר כבר "out", מעין מה שנקרא buzz word.פעם זה היה מין פתרון קסם ואופציית הברירת מחדל, אם צריך כזו סריקה פשוט שעושים אותה, אבל מי יודע אולי מצאו דרך יותר טובה? פשוט לי שיש דרך יותר טובה - פחות בזבזנית ומן הסתם שניתן יותר בקלות לעצור בה ולהמשיך מאותו המקום, גם אם היא יותר איטית, כי כאמור במקומות שמתקמצנים על זכרון ומשאבים נדיר שמשתמשים ברקורסיה.
-
@eido כתב ביש חלופה טובה/עדכנית לרקורסיה?:
לדוגמא למעבר על כל הקבצים בתיקיה על כל תיקיות המשנה שלה
כמו שאמרו לך בפוסטים קודמים, אפשר לעצור רקורסיה כמובן
וזה פיתרון מעולה כשצריך אותו ויודעים איך ולמה להשתמש איתו.אני לא ייכנס כל כך למה אתה רוצה לעשות עם גוגל סקריפט, ואיך הגעת למצב שאתה יודע שיש לו לימיט של 6 דקות...
אני מנחש מההיכרות איתך שזה מדבר על גיבוי תיקיות של ימות המשיח לדרייב / משו כזה ואתה רץ ברקוריסה על ימות המשיח.
אם אני צודק בניחושים הנ״ל
1 לא מומלץ, הם יכולים לחסום אותך (ימות המשיח), אין להם rate limit גלוי, אבל הם פתאום מחליטים לחסום אותך כשהם חושבים שהגזמת. (לחסום ברמת מערכת, לא ip של גוגל)
2 אם למשל הקוד שלך מעביר קבצים חדשים שהשתנו, ואתה זוכר במשתנה בקוד שרצת כבר על שלוחות 1,2,3 ואתה באמצע 4.1.2 תוכל לשמור את זה לאיזה קובץ, ולהמשיך פעם הבאה מאותו מקום, אולי זה לא ייתן לך גיבוי כל הזמן, או להשלים אותו בכל ריצה, אבל ייתן לך משהו.
@צבי-ש כתב ביש חלופה טובה/עדכנית לרקורסיה?:
@eido כתב ביש חלופה טובה/עדכנית לרקורסיה?:
לדוגמא למעבר על כל הקבצים בתיקיה על כל תיקיות המשנה שלה
כמו שאמרו לך בפוסטים קודמים, אפשר לעצור רקורסיה כמובן
וזה פיתרון מעולה כשצריך אותו ויודעים איך ולמה להשתמש איתו.אני לא ייכנס כל כך למה אתה רוצה לעשות עם גוגל סקריפט, ואיך הגעת למצב שאתה יודע שיש לו לימיט של 6 דקות...
חוויתי על בשרי, ואז בדקתי ואכן יש מגבלה... אא"כ אתה עובד עם המנוי בתשלום שלהם שאז המגבלה היא של חצי שעה, ובכל מקרה יש מגבלה של 9 שעות ביום בסה"כ. כמו יש מגבלה של זכרון, א"א לאחסן זכרון של 50 מ"ב (ז"א א"א להוריד קובץ בגודל 50 מ"ב אם השרת שמורידים ממנו לא תומך בהורדה בחלקים).
אני מנחש מההיכרות איתך שזה מדבר על גיבוי תיקיות של ימות המשיח לדרייב / משו כזה ואתה רץ ברקוריסה על ימות המשיח.
אין עליך

אם אני צודק בניחושים הנ״ל
1 לא מומלץ, הם יכולים לחסום אותך (ימות המשיח), אין להם rate limit גלוי, אבל הם פתאום מחליטים לחסום אותך כשהם חושבים שהגזמת. (לחסום ברמת מערכת, לא ip של גוגל)
לכן אנ מגביל את זה ברמת הסקריפט לטריגרים לפי מספר ימים, לא אמור להוות בעיה.
2 אם למשל הקוד שלך מעביר קבצים חדשים שהשתנו, ואתה זוכר במשתנה בקוד שרצת כבר על שלוחות 1,2,3 ואתה באמצע 4.1.2 תוכל לשמור את זה לאיזה קובץ, ולהמשיך פעם הבאה מאותו מקום, אולי זה לא ייתן לך גיבוי כל הזמן, או להשלים אותו בכל ריצה, אבל ייתן לך משהו.
נכון, אבל אם יש כמה סוגי קבצים ועל כל קובץ יש סוג אחר של פעולה זה מסובך כי צריך גם לזכור באיזה סוג קובץ הייתי ובאיזה קובץ ספציפי.
-
@צבי-ש כתב ביש חלופה טובה/עדכנית לרקורסיה?:
@eido כתב ביש חלופה טובה/עדכנית לרקורסיה?:
לדוגמא למעבר על כל הקבצים בתיקיה על כל תיקיות המשנה שלה
כמו שאמרו לך בפוסטים קודמים, אפשר לעצור רקורסיה כמובן
וזה פיתרון מעולה כשצריך אותו ויודעים איך ולמה להשתמש איתו.אני לא ייכנס כל כך למה אתה רוצה לעשות עם גוגל סקריפט, ואיך הגעת למצב שאתה יודע שיש לו לימיט של 6 דקות...
חוויתי על בשרי, ואז בדקתי ואכן יש מגבלה... אא"כ אתה עובד עם המנוי בתשלום שלהם שאז המגבלה היא של חצי שעה, ובכל מקרה יש מגבלה של 9 שעות ביום בסה"כ. כמו יש מגבלה של זכרון, א"א לאחסן זכרון של 50 מ"ב (ז"א א"א להוריד קובץ בגודל 50 מ"ב אם השרת שמורידים ממנו לא תומך בהורדה בחלקים).
אני מנחש מההיכרות איתך שזה מדבר על גיבוי תיקיות של ימות המשיח לדרייב / משו כזה ואתה רץ ברקוריסה על ימות המשיח.
אין עליך

אם אני צודק בניחושים הנ״ל
1 לא מומלץ, הם יכולים לחסום אותך (ימות המשיח), אין להם rate limit גלוי, אבל הם פתאום מחליטים לחסום אותך כשהם חושבים שהגזמת. (לחסום ברמת מערכת, לא ip של גוגל)
לכן אנ מגביל את זה ברמת הסקריפט לטריגרים לפי מספר ימים, לא אמור להוות בעיה.
2 אם למשל הקוד שלך מעביר קבצים חדשים שהשתנו, ואתה זוכר במשתנה בקוד שרצת כבר על שלוחות 1,2,3 ואתה באמצע 4.1.2 תוכל לשמור את זה לאיזה קובץ, ולהמשיך פעם הבאה מאותו מקום, אולי זה לא ייתן לך גיבוי כל הזמן, או להשלים אותו בכל ריצה, אבל ייתן לך משהו.
נכון, אבל אם יש כמה סוגי קבצים ועל כל קובץ יש סוג אחר של פעולה זה מסובך כי צריך גם לזכור באיזה סוג קובץ הייתי ובאיזה קובץ ספציפי.
@eido כתב ביש חלופה טובה/עדכנית לרקורסיה?:
נכון, אבל אם יש כמה סוגי קבצים ועל כל קובץ יש סוג אחר של פעולה זה מסובך כי צריך גם לזכור באיזה סוג קובץ הייתי ובאיזה קובץ ספציפי.
0
אז לפני שאתה מתחיל את הסקריפט, תספור זמנים ואם עובר 5 ומשהו דקות, תסיים עיבוד לקובץ הנוכחי, תשמור תמונת מצב נוכחית באיזה json ותרים משם מחדש.
אולי תעשה קריאה לעוד סקריפט שאותו תפעיל עם בקשת get שיתחיל מאותו מקום, וישאב את הjson או יקבל בפרמטרים את הנתיב שהוא אוחז בו או לא יודע מה, אולי ב bady את כל התמונת מצב איפה אתה אוחז ומה עשית, וככה כן תוכל להמשיך עד לגיבוי מלא, אבל זה דרך עקומה ללכת, יותר הגיוני להפעיל את זה פשוט משרת רגיל ואמיתי עם קוד חסכוני ויעיל כמה שיותר, ואם ייקח שעתיים, שייקח שעתיים, גיבוי עלול לקחת זמן -
@eido כתב ביש חלופה טובה/עדכנית לרקורסיה?:
נכון, אבל אם יש כמה סוגי קבצים ועל כל קובץ יש סוג אחר של פעולה זה מסובך כי צריך גם לזכור באיזה סוג קובץ הייתי ובאיזה קובץ ספציפי.
0
אז לפני שאתה מתחיל את הסקריפט, תספור זמנים ואם עובר 5 ומשהו דקות, תסיים עיבוד לקובץ הנוכחי, תשמור תמונת מצב נוכחית באיזה json ותרים משם מחדש.
אולי תעשה קריאה לעוד סקריפט שאותו תפעיל עם בקשת get שיתחיל מאותו מקום, וישאב את הjson או יקבל בפרמטרים את הנתיב שהוא אוחז בו או לא יודע מה, אולי ב bady את כל התמונת מצב איפה אתה אוחז ומה עשית, וככה כן תוכל להמשיך עד לגיבוי מלא, אבל זה דרך עקומה ללכת, יותר הגיוני להפעיל את זה פשוט משרת רגיל ואמיתי עם קוד חסכוני ויעיל כמה שיותר, ואם ייקח שעתיים, שייקח שעתיים, גיבוי עלול לקחת זמן -
אני מגיב כאן כי השרשור השני נעול.
אני אולי לא לגמרי מעודכן בצרכים אבל אם אני מבין נכון אתה מתעסק עם 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. -
אני מגיב כאן כי השרשור השני נעול.
אני אולי לא לגמרי מעודכן בצרכים אבל אם אני מבין נכון אתה מתעסק עם 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.@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);} }); } -
אני מגיב כאן כי השרשור השני נעול.
אני אולי לא לגמרי מעודכן בצרכים אבל אם אני מבין נכון אתה מתעסק עם 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.@chv כתב ביש חלופה טובה/עדכנית לרקורסיה?:
ויכול להיות שמה שאנשים פה הגיבו לך איך שהגיבו זה בגלל שתי סיבות: הם לא מכירים ואין להם ניסיון ספציפית עם גוגל דרייב api, וגם שהבעיה לא באמת הובהרה כיאות על ידך
אני חוסך לך לגלול למעלה, ההודעות שלו היו:
@eido כתב ביש חלופה טובה/עדכנית לרקורסיה?:
כשהתחלתי ללמוד תכנות רקורסיה זה היה "הדבר", אבל נשמע שהיום זה פחות מומלץ, יש חלופה אחרת יותר טובה? מה מקובל היום? לדוגמא למעבר על כל הקבצים בתיקיה על כל תיקיות המשנה שלה, מה מומלץ? לכאורה רקורסיה זה הפתרון...
@eido כתב במעבר על תיקיות ותתי תיקיות על כל קבציהן בלי רקורסיה:
מה הדרך הטובה ביותר לעבור על תיקיות ותתי תיקיות על כל קבציהן מבלי להשתמש ברקורסיה? צריך שיהיה אפשר בקלות לעצור בנקודה מסוימת ולהמשיך ממנה אח"כ.
לתפוס מינימום זכרון בו זמנית.אחרי שני ההודעות-נושאים האלה, עם הכותרות שלהן, עדיין נשארה שאלה למה הגיבו "כמו שהגיבו"?
השאלה עליך... -
@chv כתב ביש חלופה טובה/עדכנית לרקורסיה?:
ויכול להיות שמה שאנשים פה הגיבו לך איך שהגיבו זה בגלל שתי סיבות: הם לא מכירים ואין להם ניסיון ספציפית עם גוגל דרייב api, וגם שהבעיה לא באמת הובהרה כיאות על ידך
אני חוסך לך לגלול למעלה, ההודעות שלו היו:
@eido כתב ביש חלופה טובה/עדכנית לרקורסיה?:
כשהתחלתי ללמוד תכנות רקורסיה זה היה "הדבר", אבל נשמע שהיום זה פחות מומלץ, יש חלופה אחרת יותר טובה? מה מקובל היום? לדוגמא למעבר על כל הקבצים בתיקיה על כל תיקיות המשנה שלה, מה מומלץ? לכאורה רקורסיה זה הפתרון...
@eido כתב במעבר על תיקיות ותתי תיקיות על כל קבציהן בלי רקורסיה:
מה הדרך הטובה ביותר לעבור על תיקיות ותתי תיקיות על כל קבציהן מבלי להשתמש ברקורסיה? צריך שיהיה אפשר בקלות לעצור בנקודה מסוימת ולהמשיך ממנה אח"כ.
לתפוס מינימום זכרון בו זמנית.אחרי שני ההודעות-נושאים האלה, עם הכותרות שלהן, עדיין נשארה שאלה למה הגיבו "כמו שהגיבו"?
השאלה עליך...@dovid הכל טוב ברור לי וגם כתבתי, שהבעיה ממש לא הובהרה כיאות.
@eido קטעי הקוד שהבאת חלקיים מידיי (ואוסיף שעבורי הם קשים לקריאה, כנראה בגלל שאני לא יודע לקרוא קוד ככ טוב) ולא מתארים באמת את הצורך ואת הפיתרון שאתה מנסה לממש. זו זכותך כמובן לא לחשוף את כל הקודבייס.. אבל קשה לכווין אותך ככה.
תצטרך גם להבהיר את הסיטואציה הקלאסית שלך, כלומר איזה מין מבנה קבצים אתה מתעסק בדרך כלל (סדר גודל של קינון ומבנה נתונים וכדו')@י.פל. כתב ביש חלופה טובה/עדכנית לרקורסיה?:
יתכן שהפתרון לבעייה הוא פשוט לעבור לשימוש בחשבון בתשלום/עמותות, שם מגבלת זמן הריצה עולה מאוד.
אני לא חושב שזה 'פיתרון' זה אולי יכול לעקוף את הבעיה - כך שזה כבר לא תשובה לשאלה בפורום אלא פשוט 'פיתרון' עסקי. כאן זה פורום שהרעיון הוא שמעלים סיטואציות כלליות ושאלות כלליות ולא רק 'כואב לי כך' ו'הנה פיתרון עסקי'.
זה אמור להיות מצב שמגרה אנשים לענות ולא להרגיש כאילו הם אלטרנטיבה לLLM מטופש.