سريع (ضغط)
Snappy (المعروفة سابقًا باسم Zippy ) هي مكتبة ضغط وفك ضغط بيانات سريعة ، كُتبت بلغة C ++ بواسطة جوجل، استنادًا إلى أفكار من LZ77، وأُتيحت كمصدر مفتوح في عام 2011. [ 3 ] [ 4 ] لا تهدف إلى تحقيق أقصى قدر من الضغط، أو التوافق مع أي مكتبة ضغط أخرى؛ بل تهدف إلى تحقيق سرعات عالية جدًا وضغط معقول. تبلغ سرعة الضغط 250 ميجابايت/ثانية وسرعة فك الضغط 500 ميجابايت/ثانية باستخدام نواة واحدة من معالج "Westmere" Core i7 بسرعة 2.26 جيجاهرتز، من إنتاج عام 2011 تقريبًا ، يعمل بنظام 64 بت . نسبة الضغط أقل بنسبة 20-100% من gzip . [ 5 ]
يُستخدم Snappy على نطاق واسع في مشاريع جوجل مثل Bigtable و MapReduce ، وفي ضغط البيانات لأنظمة RPC الداخلية لجوجل . كما يُمكن استخدامه في مشاريع مفتوحة المصدر مثل MariaDB ColumnStore ، [ 6 ] وCassandra و Couchbase و Hadoop و LevelDB و MongoDB و RocksDB و Lucene و Spark و Parquet و InfluxDB ، [ 7 ] و Ceph . [ 8 ] يستخدم Firefox برنامج Snappy لضغط البيانات في localStorage . [ 9 ] ويتم اختبار فك الضغط للكشف عن أي أخطاء في البيانات المضغوطة. لا يستخدم Snappy لغة التجميع المضمنة (باستثناء بعض التحسينات [ 10 ] ) ، وهو برنامج قابل للنقل.
تنسيق البث
لا يعتمد ترميز Snappy على البتات، بل على البايتات (حيث تُرسل أو تُستهلك البايتات الكاملة فقط من التدفق). ولا يستخدم هذا التنسيق أي مُشفِّر إنتروبيا ، مثل ترميز هوفمان أو الترميز الحسابي .
تمثل البايتات الأولى من التدفق طول البيانات غير المضغوطة، المخزنة كعدد صحيح متغير ذي ترتيب البايتات الصغير [ 11 ] : القسم 1، مما يسمح باستخدام رمز متغير الطول . تُستخدم البتات السبعة السفلى من كل بايت للبيانات، بينما تُستخدم البتة العليا كعلامة للإشارة إلى نهاية حقل الطول.
يتم ترميز البايتات المتبقية في التدفق باستخدام أحد أنواع العناصر الأربعة. يتم ترميز نوع العنصر في البتتين السفليتين من البايت الأول ( بايت الوسم ) للعنصر: [ 12 ]
- 00 – بيانات حرفية – بيانات غير مضغوطة؛ تُستخدم البتات الستة العليا لتخزين طول البيانات (len-1). تُخزن الأطوال الأكبر من 60 في عدد صحيح يتراوح بين 1 و4 بايت، ويُشار إليه بطول مكون من 6 بتات، من 60 (بايت واحد) إلى 63 (4 بايت).
- 01 – نسخ مع تخزين الطول كـ 3 بتات والإزاحة المخزنة كـ 11 بتًا؛ يتم استخدام بايت واحد بعد بايت العلامة لجزء من الإزاحة؛
- 10 – نسخ مع تخزين الطول على شكل 6 بتات من بايت العلامة وتخزين الإزاحة على شكل عدد صحيح مكون من بايتين بعد بايت العلامة؛
- 11 – نسخ مع تخزين الطول على شكل 6 بتات من بايت العلامة والإزاحة المخزنة على شكل عدد صحيح صغير النهاية مكون من أربعة بايتات بعد بايت العلامة؛
تشير النسخة إلى القاموس (البيانات التي تم فك ضغطها للتو). الإزاحة هي المسافة من الموضع الحالي إلى دفق البيانات الذي تم فك ضغطه مسبقًا. الطول هو عدد البايتات المراد نسخها من القاموس. كان حجم القاموس محدودًا في الإصدار 1.0 من برنامج Snappy الضاغط إلى 32,768 بايت، وتم تحديثه إلى 65,536 بايت في الإصدار 1.1.
يمكن العثور على الوصف الرسمي الكامل لتنسيق snappy في مستودع جوجل على GitHub. [ 11 ]
مثال على دفق مضغوط
النص
ويكيبيديا مشروع موسوعي مجاني، قائم على الإنترنت، تعاوني، ومتعدد اللغات.
قد يتم ضغطها إلى هذا الشكل، وعرضها كبيانات سداسية عشرية مع شروحات:
000000 51 f0 42 57 69 6b 69 70 65 64 69 61 20 69 73 20 >Q.BWikipedia is < 000010 61 20 66 72 65 65 2c 20 77 65 62 2d 62 61 73 65 >موقع مجاني على الإنترنت< 000020 64 2c 20 63 6f 6c 6c 61 62 6f 72 61 74 69 76 65 >d, collaborative< 000030 2c 20 6d 75 6c 74 69 6c 69 6e 67 75 61 6c 20 65 >, متعدد اللغات e<
يبدأ التدفق بطول البيانات غير المضغوطة كعدد صحيح متغير (varint) ، لذا فإن البايت الأول، مع مسح البت الأعلى، يُقابل طولًا قدره 81 بايت (51 × 16 ). [ 11 ] : القسم 1
يجب أن تكون الكتلة الأولى قيمة حرفية، ويتوافق معها f042 : يُقسّم البايت الأول على النحو التالي: f0 16 ⇒ len−1=111100 2 ;type=00 2 ; يشير النوع 0 إلى قيمة حرفية، وطول 111100 2 = 60 يعني أن الطول يُقرأ من البايت التالي، وفي هذه الحالة 42 16 = 66. تلي ذلك أول 66 بايت من النص (" ويكيبيديا موسوعة حرة، قائمة على الويب، تعاونية، متعددة اللغات "). [ 11 ] : 2.1
000040 6e 63 79 63 6c 6f 09 3f 1c 70 72 6f 6a 65 63 74 >ncyclo.?.project< 000050 2e >.<
يتكون رأس الكتلة التالية من 093f ، مُقسَّمًا إلى 09 16 ⇒ off h = 000 2 ,len−4=010 2 ;type=01 2 : يشير النوع 1 إلى "نسخة بإزاحة بايت واحد": يبلغ طول النسخة 010 2 + 4 = 6 بايت، والإزاحة عبارة عن عدد صحيح من 11 بت، بتاته العليا هي off h وباته الدنيا هي البايت التالي: 3f ، لذا {off h }{3f 16 }=00000111111 2 = 63. [ 11 ] : 2.2,2.2.1
هذا يعني نسخ 6 بايتات، بدءًا من 63 بايتًا مضت - نظرًا لأنه تم نسخ 67 بايتًا بالفعل، فإن هذا يُقيّم إلى نسخ 6 بايتات بدءًا من الموضع 4 (من البايت الخامس)، مما ينتج عنه " pedia ".
لا يحتوي هذا الجزء على أي محتوى آخر، وبالتالي يبدأ الجزء التالي مباشرةً بعده – 1c 16 ⇒ len−1=000111 2 ;type=00 2 ، أي قيمة حرفية بطول 000111 2 +1=8. [ 11 ] : 2.1 يتبع ذلك الجزء الأخير من النص (" المشروع. ").
في هذا المثال، تم حذف جميع السلاسل الفرعية المشتركة التي تتكون من أربعة أحرف أو أكثر أثناء عملية الضغط. تستطيع برامج الضغط الأكثر شيوعًا ضغط هذه البيانات بشكل أفضل. وعلى عكس طرق الضغط مثل gzip و bzip2، لا يتم استخدام ترميز الإنتروبيا لتجميع الأحرف الأبجدية في تدفق البتات.
تنسيق الإطار
يدعم تدفق Snappy المدخلات بحجم إجمالي يصل إلى 4GiB−1، [ 11 ] : القسم 1 وقد يضيف حملاً زائداً كبيراً للأقسام غير المضغوطة أو المضغوطة بشكل غير كافٍ، فضلاً عن عدم كونه ذاتي التعريف، وعدم وجود آلية لسلامة البيانات تتجاوز فحص حجم الإخراج البسيط.
للتغلب على هذه المشكلات، يمكن استخدام تنسيق تأطير Snappy [ 2 ] "Snappy framed"، الذي يقسم المدخلات إلى أجزاء يصل حجمها إلى 64 كيلوبايت، [ 2 ] : 4.2، 4.3 مفصولة برؤوس كتل مكونة من 4 بايت (معرف من بايت واحد وطول من ثلاثة بايت): [ 2 ] : القسم 1
- يجب أن يبدأ "معرف التدفق"، من النوع FF 16 ، التدفق، ويجب أن يتكون حصريًا من "sNaPpY" في ASCII ، [ 2 ] : 4.1
- تحتوي "البيانات المضغوطة"، من النوع 0، على دفق Snappy مضغوط، [ 2 ] : 4.2
- تحتوي "البيانات غير المضغوطة"، من النوع 1، على البيانات المراد نسخها إلى المخرجات حرفيًا. [ 2 ] : 4.3
يحتوي كلا النوعين من أجزاء البيانات أيضًا على مجموع اختبار CRC-32C للبيانات غير المضغوطة.
تُعتبر أجزاء البيانات من النوع 2-7F 16 محجوزة ويجب أن تُؤدي إلى أخطاء. [ 2 ] : 4.5 أما أجزاء البيانات من النوع 80 16 -FE 16 فقد تتجاهلها برامج فك الضغط التي لا تفهمها. [ 2 ] : 4.4، 4.6
واجهات
تتضمن توزيعات Snappy روابط C++ وC. وتشمل الروابط والمنافذ المقدمة من جهات خارجية [ 13 ] C# ، و Common Lisp ، و Crystal (لغة برمجة) ، وErlang ، وGo ، و Haskell ، و Lua ، وJava ، و Nim ، وNode.js ، وPerl ، و PHP ، وPython ، وR ، وRuby ، وRust ، و Smalltalk ، و OpenCL . [ 14 ] [ 15 ] كما يتوفر برنامج بواجهة سطر أوامر . [ 16 ]
انظر أيضاً
مراجع
- ↑ "الإصدارات - google/snappy" . تم الاطلاع عليه في 4 أكتوبر 2023 – عبر GitHub .
- 1 2 3 4 5 6 7 8 9 "وصف تنسيق تأطير Snappy" . GitHub . 26 أكتوبر 2021.
- ↑ "Google Snappy – مكتبة ضغط سريعة" . InfoQ . تم الاطلاع عليه في 1 أغسطس 2011 .
- ↑ جوجل تفتح مصادر ضغط MapReduce. باسم السرعة // ذا ريجستر، ٢٤ مارس ٢٠١١
- ↑ "Snappy: برنامج ضغط/فك ضغط سريع: ملف التعليمات" . كود جوجل . تم الاطلاع عليه في 1 أغسطس 2011 .
{{cite web}}: CS1 maint: deprecated archiveal service ( link ) "Snappy vs lzo vs zlib" . - ↑ "بنية تخزين ColumnStore" . قاعدة معارف MariaDB .
- ↑ سريع. ضاغط/مفك ضغط سريع - صفحة المشروع على جوجل كود
- ↑ "الضغط - وثائق Ceph" . تم الاطلاع عليه بتاريخ 2024-01-03 .
- ↑ "SnappyUtils.cpp - mozsearch" . تم الاطلاع عليه بتاريخ 2024-01-03 .
- ↑ "أضف توجيهًا لمحاذاة الحلقة لتجاوز مشكلة تراجع الأداء. · google/snappy@824e671" . GitHub .
- 1 2 3 4 5 6 7 "وصف تنسيق Snappy المضغوط" . GitHub . 26 أكتوبر 2021.
- ↑ "GitHub - google/snappy: برنامج ضغط/فك ضغط سريع" . 11 نوفمبر 2019 - عبر GitHub.
- ↑ "سريع" . سريع .
- ↑ "زيلينكس" . زيلينكس .
- ↑ "InAccel" . InAccel .
- ↑ "snappy-tools: snappy(1): ضغط وفك ضغط Snappy مع وبدون تأطير" . sourcehut . تم الاسترجاع في 15 فبراير 2024 .
روابط خارجية
- تنسيقات الأرشيف
- برامج مجانية متعددة المنصات
- برنامج مجاني لضغط البيانات
- مكتبات C++
- ضغط البيانات
- مكتبات حاسوب مجانية
- البرامج التي تستخدم ترخيص BSD
