כיווץ קובץ בינרי מבלי לפגוע בגישה הישירה ל-blobs שבתוכו (C#)
-
יש לי קובץ בינארי עם blobs של מידע בגודל אחיד. אני רוצה לכווץ אותו אבל לגשת למידע באופן ישיר (כלומר אם למשל אני רוצה לגשת לblob מספר ארבע). בסוף הקובץ ישנו מספר שאומר מהו אורך הblobs בתוך הקובץ (יש עוד דברים בקובץ). כאשר אני מקווץ את הקובץ אני לא מצליח לגשת למידע הזה וממילא גם לא לblobs.
ייתכן שאפילו לא שאלתי את השאלה בצורה נכונה כי אני עם ארץ גמור בנושאים אלו אשמח לקבל כל עזרה או הסבר.
נ.ב. אני עובד ב-C# מה שניסתי הוא gzip
כמו"כ אני לא רוצה לקרוא את כל הקובץ בבת אחת זה קובץ מאוד מאוד כבד. -
הקובץ מכיל אינדקס בסופו עם בלובים בגודל קבוע המכילים מידע על מיקומים וגדלים של בלובים בגודל בלתי קבוע בתוך המסמך, בסוף הקובץ ישנו מספר שמתאר את אורך האינדקס.
כאשר הקובץ מכווץ (למשל עם Gzip), הגישה הישירה לאינדקס נקטעת. אני לא מצליח לקרוא את האינדקס מבלי להסיר את הכיווץ מכל הקובץ קודם.בעצם אני מדבר על Random acces לחלקים מתוך התוכן של קובץ מכווץ.
-
@pcinfogmach אם אתה יכול לשנות את מבנה הקובץ, אז תשנה אותו כמו שכתב @OdedDvir שהמידע על ה - blobים יהיה בתחילת הקובץ (offset, length) ורק ה blobים עצמם יהיו מכווצים, לא כל הקובץ.
-
@pcinfogmach כתב בכיווץ קובץ בינרי מבלי לפגוע בגישה הישירה ל-blobs שבתוכו (C#):
ברם אם הבנתי נכון Zlob תופס הרבה יותר מקום מאשר קובץ שכולו מכווץ
כדי לקבל random access נדמה לי שאין לך ברירה. מה שכן אפשר לבדוק זה אפשרות של "מילון" מותאם אישית משותף לכל ה-blob-ים המכווצים. זה אמור להיות כמעט זהה לכיווץ כל הקובץ (ההשפעה שיהיה לזה על הדחיסה תלוי מאוד בתוכן ה-blob-ים)
ע"ע: https://github.com/EamonNerbonne/ZlibWithDictionaryנ.ב. אם לא היה מספיק ברור: zlob זו מילה מומצאת ל-blob מכווץ
עריכה: אני רואה ש-mysql כבר המציאו את המילה -
@pcinfogmach כתב בכיווץ קובץ בינרי מבלי לפגוע בגישה הישירה ל-blobs שבתוכו (C#):
@OdedDvir
תודה ברם אם הבנתי נכון Zlob תופס הרבה יותר מקום מאשר קובץ שכולו מכווץ.בעיקרון זה נכון, כי כיווץ עובד על תדירות של מופעים זהים של מידע, וההסתברות לחזרה של מידע היא ביחס ישר לכמות המידע
@yossiz כתב בכיווץ קובץ בינרי מבלי לפגוע בגישה הישירה ל-blobs שבתוכו (C#):
עריכה: אני רואה ש-mysql כבר המציאו את המילה
חח, אשרי שכיוונתי
-
@OdedDvir כתב בכיווץ קובץ בינרי מבלי לפגוע בגישה הישירה ל-blobs שבתוכו (C#):
בעיקרון זה נכון, כי כיווץ עובד על תדירות של מופעים זהים של מידע, וההסתברות לחזרה של מידע היא ביחס ישר לכמות המידע
זה עיקרון נכון על כמויות קטנות.
אם החומר הוא למשל טקסטואלי, אז אם מדובר בחתיכות מספיק גדולות (2 מגה למשל) אין משמעות ריאלית כמעט לתוספת, למרות שהתיאוריה נשארת בלי סוף.@pcinfogmach
אם מדובר בחתיכות קטנות יותר, אז אני מבין סוף סוף את השאלה. התשובה היא הכיוון ש@yossiz הציע, דחיסה מבוססת מילון משותף, או מילון סטטי.
אם אני מנחש נכון ומדובר בטקסטים תורניים זה עלול גם לשפר יעילות+ביצועי דחיסה/פריסה. -
@dovid כתב בכיווץ קובץ בינרי מבלי לפגוע בגישה הישירה ל-blobs שבתוכו (C#):
אם אני מנחש נכון ומדובר בטקסטים תורניים זה עלול גם לשפר יעילות+ביצועי דחיסה/פריסה.
יעילות הדחיסה אכן השתפרה:
ניסיתי כעת בעצמי את ספריית ZstdNet על קובץ יבמות של תורת אמת (MN_YEVAMOT_L2.txt) עם אימון מול כל השורות ודחיסה של כל שורה בנפרד, תוצאות מצויינות: כלל השורות ביחד 12% לעומת 40% בGZipStream.
אבל הביצועים לא, הדחיסה הזו איטית משמעותית מGZipStream.
פה השאלה היא על יעילות פריסה ולא על דחיסה (שכנראה לא מבוצעת בשגרה), זה אבדוק בהמשך בע"ה. -
פוסט זה נמחק!