Zstandard ، أو zstd
كإصدار قصير، عبارة عن خوارزمية ضغط سريعة بدون فقدان البيانات، تستهدف سيناريوهات الضغط في الوقت الفعلي على مستوى zlib ونسب ضغط أفضل. إنه مدعوم بمرحلة إنتروبيا سريعة جدًا، مقدمة من مكتبة Huff0 وFSE.
تنسيق Zstandard مستقر وموثق في RFC8878. تتوفر بالفعل تطبيقات مستقلة متعددة. يمثل هذا المستودع التنفيذ المرجعي، المقدم كمكتبة C مفتوحة المصدر مزدوجة BSD أو GPLv2 مرخصة، وأداة مساعدة لسطر الأوامر لإنتاج وفك تشفير ملفات .zst
و .gz
و .xz
و .lz4
. إذا كان مشروعك يتطلب لغة برمجة أخرى، فسيتم توفير قائمة بالمنافذ والارتباطات المعروفة على صفحة Zstandard الرئيسية.
حالة فرع التطوير:
كمرجع، تم اختبار العديد من خوارزميات الضغط السريع ومقارنتها على سطح مكتب يتميز بوحدة المعالجة المركزية Core i7-9700K بسرعة 4.9 جيجا هرتز ويعمل بنظام Ubuntu 20.04 ( Linux ubu20 5.15.0-101-generic
)، باستخدام lzbench، وهو برنامج مفتوح المصدر في الذاكرة. تم تجميع المعيار بواسطة @inikep باستخدام gcc 9.4.0، في مجموعة ضغط Silesia.
اسم الضاغط | نسبة | ضغط | فك الضغط. |
---|---|---|---|
زستد 1.5.6 -1 | 2.887 | 510 ميجابايت/ثانية | 1580 ميجابايت/ثانية |
زليب 1.2.11 -1 | 2.743 | 95 ميجابايت/ثانية | 400 ميجابايت/ثانية |
بروتلي 1.0.9 -0 | 2.702 | 395 ميجابايت/ثانية | 430 ميجابايت/ثانية |
zstd 1.5.6 --سريع=1 | 2.437 | 545 ميجابايت/ثانية | 1890 ميجابايت/ثانية |
zstd 1.5.6 --سريع=3 | 2.239 | 650 ميجابايت/ثانية | 2000 ميجابايت/ثانية |
كويكلز 1.5.0 -1 | 2.238 | 525 ميجابايت/ثانية | 750 ميجابايت/ثانية |
lzo1x2.10 -1 | 2.106 | 650 ميجابايت/ثانية | 825 ميجابايت/ثانية |
lz41.9.4 | 2.101 | 700 ميجابايت/ثانية | 4000 ميجابايت/ثانية |
لزف 3.6-1 | 2.077 | 420 ميجابايت/ثانية | 830 ميجابايت/ثانية |
لاذع 1.1.9 | 2.073 | 530 ميجابايت/ثانية | 1660 ميجابايت/ثانية |
مستويات الضغط السلبية، المحددة بـ --fast=#
، توفر سرعة ضغط وإلغاء ضغط أسرع على حساب نسبة الضغط.
يمكن لـ Zstd أيضًا تقديم نسب ضغط أقوى على حساب سرعة الضغط. يمكن تكوين مقايضة السرعة مقابل الضغط بزيادات صغيرة. يتم الحفاظ على سرعة إلغاء الضغط وتظل كما هي تقريبًا في جميع الإعدادات، وهي خاصية مشتركة بين معظم خوارزميات ضغط LZ، مثل zlib أو lzma.
تم إجراء الاختبارات التالية على خادم يقوم بتشغيل Linux Debian ( Linux version 4.14.0-3-amd64
) مع وحدة المعالجة المركزية Core i7-6700K بسرعة 4.0 جيجا هرتز، باستخدام lzbench، وهو اختبار مرجعي مفتوح المصدر في الذاكرة بواسطة @inikep وتم تجميعه باستخدام gcc 7.3.0، على مجموعة ضغط سيليزيا.
سرعة الضغط مقابل النسبة | سرعة فك الضغط |
---|---|
يمكن لعدد قليل من الخوارزميات الأخرى إنتاج نسب ضغط أعلى بسرعات أبطأ، وتقع خارج الرسم البياني. للحصول على صورة أكبر تتضمن الأوضاع البطيئة، انقر على هذا الرابط.
توفر المخططات السابقة نتائج قابلة للتطبيق على سيناريوهات الملفات والدفق النموذجية (عدة ميغابايت). البيانات الصغيرة تأتي مع وجهات نظر مختلفة.
كلما قلت كمية البيانات المطلوب ضغطها، زادت صعوبة ضغطها. هذه المشكلة شائعة في جميع خوارزميات الضغط، والسبب هو أن خوارزميات الضغط تتعلم من البيانات السابقة كيفية ضغط البيانات المستقبلية. ولكن في بداية مجموعة البيانات الجديدة، لا يوجد "ماضي" يمكن البناء عليه.
لحل هذا الموقف، تقدم Zstd وضع التدريب ، والذي يمكن استخدامه لضبط الخوارزمية لنوع محدد من البيانات. يتم تحقيق تدريب Zstandard من خلال تزويده بعدد قليل من العينات (ملف واحد لكل عينة). يتم تخزين نتيجة هذا التدريب في ملف يسمى "القاموس"، والذي يجب تحميله قبل الضغط وإلغاء الضغط. باستخدام هذا القاموس، تتحسن نسبة الضغط التي يمكن تحقيقها على البيانات الصغيرة بشكل كبير.
يستخدم المثال التالي مجموعة نماذج github-users
، التي تم إنشاؤها من واجهة برمجة تطبيقات github العامة. وهو يتألف من حوالي 10 آلاف سجل يبلغ وزن كل منها حوالي 1 كيلو بايت.
نسبة الضغط | سرعة الضغط | سرعة فك الضغط |
---|---|---|
يتم تحقيق مكاسب الضغط هذه مع توفير سرعات ضغط وإلغاء ضغط أسرع في نفس الوقت.
ينجح التدريب إذا كان هناك بعض الارتباط في مجموعة من عينات البيانات الصغيرة. كلما كان القاموس أكثر تحديدًا للبيانات، زادت كفاءته (لا يوجد قاموس عالمي ). ومن ثم، فإن نشر قاموس واحد لكل نوع من البيانات سيوفر أكبر الفوائد. تكون مكاسب القاموس فعالة في الغالب في الكيلوبايت القليلة الأولى. بعد ذلك، ستستخدم خوارزمية الضغط تدريجيًا المحتوى الذي تم فك تشفيره مسبقًا لضغط بقية الملف بشكل أفضل.
قم بإنشاء القاموس
zstd --train FullPathToTrainingSet/* -o dictionaryName
ضغط مع القاموس
zstd -D dictionaryName FILE
فك الضغط مع القاموس
zstd -D dictionaryName --decompress FILE.zst
make
هو نظام البناء الذي تمت صيانته رسميًا لهذا المشروع. جميع أنظمة البناء الأخرى "متوافقة" ويتم الحفاظ عليها من قبل طرف ثالث، وقد تتميز باختلافات بسيطة في الخيارات المتقدمة. عندما يسمح نظامك بذلك، يفضل استخدام make
لإنشاء zstd
و libzstd
.
إذا كان نظامك متوافقًا مع make
القياسي (أو gmake
)، فسيؤدي استدعاء make
في الدليل الجذر إلى إنشاء zstd
cli في الدليل الجذر. سيتم أيضًا إنشاء libzstd
في lib/
.
تشمل الخيارات الأخرى المتاحة ما يلي:
make install
: إنشاء وتثبيت صفحات zstd cli والمكتبة والرجلmake check
: إنشاء وتشغيل zstd
، واختبار سلوكه على النظام الأساسي المحلي يتبع Makefile
اصطلاحات GNU Standard Makefile، مما يسمح بالتثبيت المرحلي والأعلام القياسية ومتغيرات الدليل ومتغيرات الأوامر.
بالنسبة لحالات الاستخدام المتقدمة، يتم توثيق علامات الترجمة المتخصصة التي تتحكم في الجيل الثنائي في lib/README.md
لمكتبة libzstd
وفي programs/README.md
لـ zstd
CLI.
يتم توفير منشئ مشروع cmake
ضمن build/cmake
. يمكنه إنشاء ملفات Makefiles أو برامج نصية بناءة أخرى لإنشاء مكتبات zstd
الثنائية و libzstd
الديناميكية والثابتة.
افتراضيًا، يتم تعيين CMAKE_BUILD_TYPE
على Release
.
يمكن إنشاء zstd
وتثبيته بدعم كل من Apple Silicon (M1/M2) بالإضافة إلى Intel باستخدام دعم Universal2 الخاص بـ CMake. لإجراء بناء وتثبيت Fat/Universal2، استخدم الأوامر التالية:
cmake -B build-cmake-debug -S build/cmake -G Ninja -DCMAKE_OSX_ARCHITECTURES= " x86_64;x86_64h;arm64 "
cd build-cmake-debug
ninja
sudo ninja install
يتم توفير مشروع Meson ضمن build/meson
. اتبع تعليمات البناء في هذا الدليل.
يمكنك أيضًا إلقاء نظرة على ملف .travis.yml
للحصول على مثال حول كيفية استخدام Meson لبناء هذا المشروع.
لاحظ أن نوع البناء الافتراضي هو الإصدار .
يمكنك إنشاء وتثبيت مدير التبعية zstd vcpkg:
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install zstd
يتم تحديث منفذ zstd في vcpkg بواسطة أعضاء فريق Microsoft والمساهمين في المجتمع. إذا كان الإصدار قديمًا، فيرجى إنشاء مشكلة أو سحب طلب على مستودع vcpkg.
يمكنك تثبيت الثنائيات المعدة مسبقًا لـ zstd أو إنشائها من المصدر باستخدام Conan. استخدم الأمر التالي:
conan install --requires= " zstd/[*] " --build=missing
يتم تحديث وصفة zstd Conan بواسطة مشرفي Conan والمساهمين في المجتمع. إذا كان الإصدار قديمًا، فيرجى إنشاء مشكلة أو سحب طلب في مستودع ConanCenterIndex.
بالذهاب إلى دليل build
، ستجد إمكانيات إضافية:
build/VS_scripts
، والتي ستقوم بإنشاء مكتبة zstd
cli و libzstd
دون الحاجة إلى فتح حل Visual Studio. يمكنك إنشاء ثنائي zstd عبر باك عن طريق تنفيذ: buck build programs:zstd
من جذر الريبو. سيكون الإخراج الثنائي في buck-out/gen/programs/
.
يمكنك بسهولة دمج zstd في مشروع Bazel الخاص بك باستخدام الوحدة المستضافة على مستودع Bazel المركزي.
يمكنك إجراء اختبارات دخان محلية سريعة عن طريق إجراء make check
. إذا لم تتمكن من استخدام make
، فقم بتنفيذ البرنامج النصي playTest.sh
من دليل src/tests
. هناك حاجة إلى متغيرين env $ZSTD_BIN
و $DATAGEN_BIN
للبرنامج النصي للاختبار لتحديد موقع الثنائي zstd
و datagen
. للحصول على معلومات حول اختبار CI، يرجى الرجوع إلى TESTING.md
.
يتم نشر Zstandard حاليًا داخل Facebook والعديد من البنى التحتية السحابية الكبيرة الأخرى. يتم تشغيله بشكل مستمر لضغط كميات كبيرة من البيانات بتنسيقات وحالات استخدام متعددة. يعتبر Zstandard آمنًا لبيئات الإنتاج.
Zstandard مرخص بشكل مزدوج بموجب BSD أو GPLv2.
فرع dev
هو الذي يتم فيه دمج جميع المساهمات قبل الوصول إلى release
. إذا كنت تخطط لاقتراح تصحيح، يرجى الالتزام بفرع dev
، أو فرع الميزات الخاص به. لا يسمح بالالتزام المباشر release
. لمزيد من المعلومات، يرجى قراءة المساهمة.