فشرده سازی فایل ها چگونه انجام می شود؟ – به زبان ساده
مهندسین نرمافزار همیشه در حال پیدا کردن راههایی بودهاند که بتوانند دادههای زیادی را در فضایی کوچک جای دهند. این اتفاق زمانی بیشتر اوج گرفت که هارد درایوهای ما کوچک بودند و محتوای زیادی در اینترنت وجود داشتند که باعث میشدند برای ذخیرهی آنها نیاز به فشردهسازی داشته باشیم. فشردهسازی فایلها نقش بزرگی در ارتباطات بازی میکند و باعث میشود که بتوانیم دادههای کوچکتری را ارسال نماییم و دانلودهای سریعتری داشته باشیم.
فشردهسازی فایلها چگونه انجام میشود؟
پاسخ دادن به این سوال نیاز به ریاضیات پیچیدهای دارد که در این مطلب جایی برای آن نیست، ولی برای درک کلی این مفهوم نیازی به مطالب پیشرفته نیست و به زبانی ساده میتوانیم آن را به شما بیاموزیم.
محبوبترین کتابخانههای فشردهسازی متن بر اساس دو الگوریتم فشردهسازی کار میکنند و از هر دو به طور همزمان برای افزایش میزان فشردهسازی بهره میبرند. این دو الگوریتم «LZ77» و «Huffman coding» نام دارند. الگوریتم «Huffman coding» بسیار پیچیده است و خیلی وارد جزئیات آن نخواهیم شد. به طور کلی، این الگوریتم از یک سری فرمولهای پیچیدهی ریاضی استفاده میکند تا کدهای باینری کوچکتری برای هر حرف در نظر گرفته و باعث کاهش اندازهی آنها شود.
ولی «LZ77» بسیار سادهتر بوده و چیزی است که بیشتر در این مطلب وارد جزئیاتش خواهیم شد. این الگوریتم سعی میکند که کلمات تکراری را حذف کرده و آنها را با یک کلید جایگزین کند. برای مثال به تصویر زیر توجه کنید:
الگوریتم «LZ77» این متن را نگاه کرده و متوجه میشود که واژهی «howtogeek» سه دفعه در آن تکرار شده است، در نتیجه آن را به شکل زیر تغییر میدهد:
زمانی که میخواهد متن را مجددا بخواند، تمامی مقادیر «(h)» را با عبارت «howtogeek» جایگزین کرده و آن را به متن اصلی خود تبدیل میکند.
این نوع فشردهسازیها را «lossless» یا «بدون از دست رفتن اطلاعات» مینامند. در این نوع تبدیلها شما در نهایت همان دادههایی را خواهید گرفت که در ابتدا داشتید و چیزی از دست نخواهد رفت.
البته در واقعیت این الگوریتم لیستی از کلیدها ندارد، بلکه بار دوم به بعدی که یک کلمه تکرار میشود را با یک لینک به محل قرارگیری کلمهی اول در حافظه جایگزین میکند.
حال زمانی که به عبارت «(h)» در متن میرسد، به عقب برگشته و به جای آن عبارت «howtogeek» را میخواند.
البته این مثال برای بهترین حالت این قضیه است. در واقعیت بیشتر متون با کلیدهایی به کوچکی چند کاراکتر فشرده میشوند. برای مثال کلمهی «the» در تمام کلمات «there»، «their» و «then» فشرده خواهد شد. زمانی که یک متن پر از تکرار داشته باشید، مقدار فشردهسازی متن شما فوقالعاده خواهد بود. برای مثال فرض کنید یک فایل متنی داریم که 100 بار عبارت «howtogeek» در آن نوشته شده است. فایل متنی اصلی سه کیلوبایت است. زمانی که این فایل را فشرده میکنیم، اندازهی آن به 158 بایت کاهش مییابد. یعنی چیزی بیشتر از 95% فشرده شده است.
مشخص است که این مثال خیلی شرایط خاصی دارد و تنها یک کلمه بارها در آن تکرار شده بود. در حالت عادی، زمانی که با فرمتی نظیر ZIP اقدام به فشردهسازی میکنید، مقدار آن چیزی حدود 30 تا %40 خواهد بود.
الگوریتم «LZ77» بر روی تمام دادههای باینری اعمال میشود و تنها مخصوص متون نیست، هرچند که فشردهسازی متون به دلیل وجود کلمات تکراری زیاد بسیار سادهتر است. با این حال میزان فشردهسازی در هر زبان متفاوت خواهد بود، برای مثال فشردهسازی زبان چینی از زبان انگلیسی بسیار سختتر است.
فیلمها و تصاویر چگونه فشرده میشوند؟
فشردهسازی صوت و تصویر بسیار متفاوت است. بر خلاف متن که میتوان بدون از دست دادن دادهها آن را فشرده کرد، در هنگام فشردهسازی تصاویر نوع فشردهسازی ما «Lossy» یا «همراه با از دست دادن دادهها» است. هرچه بیشتر این نوع فایلها را فشرده کنید، دادههای بیشتری را از دست میدهید.
قطعا متوجه تصاویر بی کیفیت زیادی در اینترنت و بر روی پروفایلهای دوستان خود شدهاید. این تصاویر چندین بار فشرده شدهاند و در نتیجه دادههای زیادی از آنها از دست رفته است.
برای مثال به تصویر زیر نگاه کنید. تصویر زیر بدون هیچگونه فشردهسازی ثبت گردیده است.
حال همان تصویر را چندین بار در فتوشاپ باز کرده و با کیفیت کم ذخیره کردهایم. نتیجهی آن به شکل زیر است:
مشاهده میکنید که تصویر بسیار بد شده است. البته این بدترین حالت ممکن است که ما هر دفعه تصویر را با کمترین کیفیت ذخیره کردهایم. در هنگام فشردهسازی معمولا %50 کیفیت آن حفظ میشود که در این حالت تقریبا تشخیص تفاوت آن غیر ممکن است، مگر این که خیلی از نزدیک به آن نگاه کنید.
فایل اصلی تصویر بالا دارای پسوند PNG و 200 کیلوبایت حجم بود، ولی فایل JPEG آن که با %50 کیفیت ذخیره شده است، تنها 28 کیلوبایت اندازه دارد.
این میزان کاهش اندازه امری مهندسی شده است. بیشتر تصاویر لیستی از اعداد را در خود ذخیره میکنند که هر عدد به یک پیکسل اشاره دارد.
فرمت JPEG به این شکل نیست. این قالب تصاویر را به گونهای ثبت میکند که به آن تبدیل کسینوسی گسسته گفته میشود. این نوع ذخیره سازی در واقع مجموعهای از امواج سینوسی هستند که در اندازههای مختلف وجود دارند. در این روش 64 فرمول متفاوت وجود دارد که البته بیشتر آنها مورد استفاده قرار نمیگیرند. نوار کیفیت تصاویر JPEG که در فتوشاپ و سایر اپلیکیشنها قرار دارند نیز به همین گونه کار میکنند، یعنی تعداد فرمولهای مورد استفاده را مشخص مینمایند. سپس اپلیکیشنهای مختلف از «Huffman encoding» برای کاهش بیشتر اندازهی تصاویر استفاده میکنند.
این ساختار باعث میشود که نسبت فشردهسازی تصاویر JPEG بسیار بالا باشد که یعنی تصویری با حجم چندین مگابایت میتواند به تنها چند کیلوبایت برسد. البته این مساله بستگی به کیفیت تصویر دارد و با کاهش بیش از حد کیفیت ممکن است به تصویری همانند تصویر زیر برسید:
همانطور که مشاهده میکنید این تصویر بسیار بی کیفیت است، ولی حتی فشردهسازی کم تصاویر JPEG هم میتواند باعث کاهش شدید اندازهی آن شود که این مساله باعث افزایش بیشتر ارزش تصاویر JPEG برای وبسایتها میشود. بیشتر تصاویری که به صورت آنلاین مشاهده میکنید فشرده شدهاند تا زمان دانلود آنها کاهش یابد. حتی تمام تصاویری که در فرادرس مورد استفاده قرار میگیرند نیز فشرده شدهاند تا صفحات ما سریعتر لود شوند.
فشردهسازی ویدئو
ویدئوها کمی از تصاویر متفاوت هستند. شاید فکر کنید که آنها نیز با استفاده از تصاویر JPEG اقدام به فشردهسازی هر فریم میکنند که البته این تصور اشتباه نیست، ولی متد بهتری نیز برای فشردهسازی ویدئوها وجود دارد.
برای فشردهسازی ویدئوها از الگوریتمی به نام «interframe compression» استفاده میشود که تغییرات هر فریم را در نظر گرفته و تنها آنها را ذخیره میکند. برای مثال اگر یک ویدئو تقریبا ثابت داشته باشید که تنها چند ثانیه به طول میانجامد، در هنگام پیادهسازی در این الگوریتم به شدت کاهش حجم خواهد داشت چراکه دیگر نیازی به ذخیرهی تمام جزئیات صحنهها نخواهید داشت. «فشردهسازی میانفریمی» تنها دلیلی است که ما تلویزیونهای دیجیتال و ویدئوهای آنلاین داریم، چراکه بدون این الگوریتم هر ویدئو چند صد گیگابایت فضا اشغال میکرد. این اندازه بیشتر از اندازهی هارد درایوهایی است که در سال 2005 در هنگام شروع کار یوتیوب در دسترس بود.
توجه داشته باشید که GIF چنین کاری انجام نمیدهد، به همین دلیل است که تصاویر GIF معمولا بسیار کوتاه هستند ولی با این حال حجم زیادی دارند.
مسالهی دیگری که باید در مورد ویدئوها در نظر بگیرید، «نرخ بیت» (Bit Rate) است. نرخ بیت مقدار دادههایی است که در هر ثانیه میتواند مورد استفاده قرار بگیرد. برای مثال اگر نرخ بیت خود را بر روی 200 کیلوبایت در ثانیه قرار داده باشید، ویدئو شما کیفیت بسیار پایینی خواهد داشت. هر چه نرخ بیت بیشتر باشد، کیفیت نیز بهتر خواهد بود، البته باز اگر از چند مگابایت بالاتر بروید باز هم با کاهش مواجه خواهید شد.
تصویر زیر یک ویدئو بزرگ شده از تصویر یک عروس دریایی است. نرخ بین تصویر چپی 3 مگابایت در ثانیه است و تصویر راستی از مقدار 100 مگابایت در ثانیه استفاده میکند.
اومدم بازی دان کنم دیدم 18 گیگو کرده 7 گیگ. برام سوال شد ببینم چجوری حجمشو کم میکنن و فشرده میکنن. مطلب خیلی مفیدی بود