שימוש ב-protobuff ב-python לכל סוג מערך

שיווקי

New member
שימוש ב-protobuff ב-python לכל סוג מערך

שלום.
אני משתמש ב-python ב-ubuntu.

יש לי מערך שאני רוצה להעביר למערכת client.

המערך הוא סדרה של אובייקטים, שהם משתנים (מוחזר מ-mongodb) ואני לא יודע מראש את טיפוס המשתנים, ואו את השדות מראש.

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

איך ניתן לעשות כן?
הספריה שאני משתמש זה protobuf (גירסה אחרונה).

אשמח לדוגמה.

תודה.
 

BravoMan

Active member
למה החלטת ללכת דווקא על protobuf?

אם מה שיש לך זה תפזורת של עצמים, אז זה לא פרוטוקול.
ולכן, protobuf לא מתאים.
&nbsp
mongo עובד עם JSON, שהיא דבר מקובל לתקשורת בין server ל-client ב-web, אז למה שפשוט לא תשתמש בו ותחסוך לעצמך המרות מיותרות?
&nbsp
יש שיטות להשיג את מה שאתה רוצה עם protobuf, למשל זו ההמלצה של Google:
https://developers.google.com/protocol-buffers/docs/techniques#self-description
&nbsp
אבל הן לא ממש נוחות ודורשות הרבה התעסקות.
 

שיווקי

New member
לחסוך זמן ב-io

json זה מה שאני משתמש בו כעת וזה ברירת המחדל של מונגו.
json הוא יותר מידי ארוך וצריך לתרגם אותו כל פעם.

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

פשוט protobuf נראה דיי מתאים לנושא (גם מקמפרס וגם סרייאלי, אך נראה שב-protobuf אני צריך להגדיר את הproperties בצורה מפורשת, ובמונגו אני מקבל document-ים דיי אקראיים במבנה שלהם).

אם לא protobuf, אז משהו שמאפשר דחיסה (ושיהיה serializable על מנת שאוכל להעבירו בקלות דרך rest api וכד') וגם פריסה מהירה בצד המקבל.

תודה.
 

פרסאוס

New member
כמה מידע יש לך שאתה צריך לקמפרס תוצאה ממונגו?

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

שיווקי

New member
לא מעט מידע.

compress/decompress של מידע שהוא בביצוע דחיסה ופריסה מספיק מהירים.
מתאים ל-python גירסה 2.7 ול-pymongo.

אני יכול להשתמש בקלות בהמרה ל-json סטנדרטי. אני מחפש משהו יותר טוב, וזה לא קשור ל-driver.

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

בסך הכל לבצע compress/decompress עוד לפני שאני מתרגם את תוצאת המונגו ל-json (כי אחרת לא חסכתי דבר).

תודה.
 

BravoMan

Active member
יש לא מעט פתרונות, אבל כדי לדעת מה מתאים לך

צריך באמת להבין מה אתה מנסה לעשות.
&nbsp
על פניו, נשמע שכל האפליקציה שלך בנויה לא נכון.
אבל כמובן אין פה מספיק מידע כדי לקבוע את זה בוודאות.
&nbsp
אתה לא צריך לחקור כל פרוטוקול ופרוטוקול ולבנות POC כדי לבדוק מי הכי טוב.
אתה צריך לעצור, לעשות design נורמלי למערכת שלך, להחליט מה עובר ואז לבחור לפי האילוצים, הדרישות, והרצונות את מה שנראה לך הכי מתאים.
&nbsp
כל דבר מעבר לזה יהיה אובר-אופטימיזציה, וזה רק מזיק!
https://www.browserling.com/tools/json-minify
https://en.wikipedia.org/wiki/HTTP_compression
 

שיווקי

New member
נראה שאתה מתעלם בכוונה מהשאלה.

ידוע שהתשובות שלך זה בהתנדבות, ואני בהחלט מודה לך על הזמן שהקדשת.

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

תודה רבה, בכל אופן.
 

BravoMan

Active member
מאיזו שאלה בדיוק התעלמתי?

שאלת איך לפענח סוג אובייקט בצורה דינמית ב-protobuf וכתבתי לך שהוא לא בנוי לזה, וזו גם העמדה הרשמית של מי שפיתח אותו.
&nbsp
שלחתי לך קישור עם הסבר ודוגמת קוד איך אפשר לעקוף את זה ולאפשר ל-protobuf לזהות דינמית מבנים, ורק צירפתי אזהרה שזה לא יהיה פשוט, כי זה workaround (גם אם הוא "רשמי" מהמפתחים של הספרייה).
&nbsp
אחרי זה שאלת איך עוד אפשר לדחוס נתונים במינימום מאמץ, ונתתי לך קישורים לשתי שיטות דחיסה הכי פשוטות בתקשורת רשת שאני מכיר.
&nbsp
נתתי לך גם הצעה איך עוד אפשר לצמצם תעבורה בלי להשתמש בשיטות דחיסה מסובכות לשימוש או קשות לשילוב.
&nbsp
אתה יכול לטעון שהפתרונות שהוצאו לך לא מתאימים, וזה לגיטימי.
היה עוזר אם היית מסביר למה הם לא מתאימים, כדי שאם משתמש אחר ירצה להציע פתרון אחר, הוא לא יבזבז זמן על פתרון לא מתאים.
&nbsp
אבל לטעון שהתעלמתי מהשאלות שלך...
 
למעלה