Zstandard หรือ zstd
เป็นเวอร์ชันสั้นเป็นอัลกอริธึมการบีบอัดแบบไม่สูญเสียข้อมูลที่รวดเร็ว โดยกำหนดเป้าหมายสถานการณ์การบีบอัดแบบเรียลไทม์ที่ระดับ zlib และอัตราส่วนการบีบอัดที่ดีขึ้น ได้รับการสนับสนุนจากระดับเอนโทรปีที่รวดเร็วมาก ซึ่งจัดทำโดยห้องสมุด Huff0 และ FSE
รูปแบบของ Zstandard นั้นเสถียรและบันทึกไว้ใน RFC8878 มีการใช้งานอิสระหลายรายการอยู่แล้ว พื้นที่เก็บข้อมูลนี้แสดงถึงการใช้งานอ้างอิง โดยเป็นไลบรารี C ที่ได้รับลิขสิทธิ์แบบ BSD หรือ GPLv2 แบบโอเพ่นซอร์ส และยูทิลิตี้บรรทัดคำสั่งที่สร้างและถอดรหัสไฟล์ .zst
, .gz
, .xz
และ .lz4
หากโปรเจ็กต์ของคุณต้องการภาษาการเขียนโปรแกรมอื่น รายการพอร์ตและการเชื่อมโยงที่รู้จักจะแสดงอยู่ในหน้าแรกของ Zstandard
สถานะสาขาพัฒนา:
สำหรับการอ้างอิง อัลกอริธึมการบีบอัดที่รวดเร็วหลายตัวได้รับการทดสอบและเปรียบเทียบบนเดสก์ท็อปที่มี Core i7-9700K CPU @ 4.9GHz และใช้งาน Ubuntu 20.04 ( Linux ubu20 5.15.0-101-generic
) โดยใช้ lzbench ซึ่งเป็นโอเพ่นซอร์สในหน่วยความจำ เกณฑ์มาตรฐานโดย @inikep คอมไพล์ด้วย gcc 9.4.0 บนคลังข้อมูลการบีบอัด Silesia
ชื่อคอมเพรสเซอร์ | อัตราส่วน | การบีบอัด | คลายการบีบอัด |
---|---|---|---|
zstd 1.5.6 -1 | 2.887 | 510 เมกะไบต์/วินาที | 1580 เมกะไบต์/วินาที |
zlib 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 เมกะไบต์/วินาที | 2,000 เมกะไบต์/วินาที |
รวดเร็ว 1.5.0 -1 | 2.238 | 525 เมกะไบต์/วินาที | 750 เมกะไบต์/วินาที |
lzo1x 2.10 -1 | 2.106 | 650 เมกะไบต์/วินาที | 825 เมกะไบต์/วินาที |
lz4 1.9.4 | 2.101 | 700 เมกะไบต์/วินาที | 4000 เมกะไบต์/วินาที |
lzf 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 CPU @ 4.0GHz โดยใช้ lzbench ซึ่งเป็นเกณฑ์มาตรฐานในหน่วยความจำโอเพ่นซอร์สโดย @inikep ที่คอมไพล์ด้วย gcc 7.3.0 บนคลังการบีบอัด Silesia
ความเร็วการบีบอัดเทียบกับอัตราส่วน | ความเร็วการบีบอัด |
---|---|
อัลกอริธึมอื่นๆ สองสามตัวสามารถสร้างอัตราส่วนการบีบอัดที่สูงขึ้นด้วยความเร็วที่ช้าลง โดยจะอยู่นอกกราฟ หากต้องการดูภาพขนาดใหญ่รวมถึงโหมดช้า ให้คลิกที่ลิงก์นี้
แผนภูมิก่อนหน้านี้แสดงผลลัพธ์ที่ใช้ได้กับสถานการณ์ไฟล์และสตรีมทั่วไป (หลาย MB) ข้อมูลขนาดเล็กมาพร้อมกับมุมมองที่แตกต่างกัน
ยิ่งจำนวนข้อมูลที่จะบีบอัดน้อยลง การบีบอัดก็จะยิ่งยากขึ้นเท่านั้น ปัญหานี้เป็นเรื่องปกติสำหรับอัลกอริธึมการบีบอัดทั้งหมด และเหตุผลก็คือ อัลกอริธึมการบีบอัดเรียนรู้จากข้อมูลในอดีตถึงวิธีการบีบอัดข้อมูลในอนาคต แต่ในช่วงเริ่มต้นของชุดข้อมูลใหม่ ไม่มี "อดีต" ให้ต่อยอด
เพื่อแก้ไขสถานการณ์นี้ Zstd เสนอ โหมดการฝึกอบรม ซึ่งสามารถใช้เพื่อปรับแต่งอัลกอริทึมสำหรับประเภทข้อมูลที่เลือก การฝึกอบรม Zstandard ทำได้โดยการจัดเตรียมตัวอย่างบางส่วน (หนึ่งไฟล์ต่อตัวอย่าง) ผลลัพธ์ของการฝึกอบรมนี้จะถูกจัดเก็บไว้ในไฟล์ชื่อ "พจนานุกรม" ซึ่งจะต้องโหลดก่อนการบีบอัดและคลายการบีบอัด เมื่อใช้พจนานุกรมนี้ อัตราการบีบอัดข้อมูลขนาดเล็กจะดีขึ้นอย่างมาก
ตัวอย่างต่อไปนี้ใช้ชุดตัวอย่าง github-users
ที่สร้างจาก API สาธารณะ github ประกอบด้วยบันทึกประมาณ 10,000 รายการ โดยแต่ละรายการมีน้ำหนักประมาณ 1KB
อัตราส่วนกำลังอัด | ความเร็วในการบีบอัด | ความเร็วการบีบอัด |
---|---|---|
การเพิ่มขึ้นของการบีบอัดเหล่านี้เกิดขึ้นได้ในขณะเดียวกันก็ให้ความเร็วในการบีบอัดและคลายการบีบอัด ที่เร็วขึ้น
การฝึกอบรมจะใช้ได้ผลหากมีความสัมพันธ์กันในกลุ่มตัวอย่างข้อมูลขนาดเล็ก ยิ่งพจนานุกรมเจาะจงข้อมูลมากเท่าใดก็ยิ่งมีประสิทธิภาพมากขึ้นเท่านั้น (ไม่มี พจนานุกรมสากล ) ดังนั้น การใช้พจนานุกรมหนึ่งรายการต่อข้อมูลประเภทหนึ่งจะให้ประโยชน์สูงสุด การเพิ่มพจนานุกรมส่วนใหญ่จะมีผลในช่วง 2-3 KB แรก จากนั้นอัลกอริธึมการบีบอัดจะค่อยๆ ใช้เนื้อหาที่ถอดรหัสก่อนหน้านี้เพื่อบีบอัดส่วนที่เหลือของไฟล์ได้ดีขึ้น
สร้างพจนานุกรม
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, ไลบรารี่ และ man pagemake check
: สร้างและรัน zstd
ทดสอบพฤติกรรมบนแพลตฟอร์มท้องถิ่น Makefile
เป็นไปตามแบบแผน Makefile มาตรฐาน GNU ซึ่งอนุญาตให้มีการติดตั้งแบบเป็นขั้น แฟล็กมาตรฐาน ตัวแปรไดเร็กทอรี และตัวแปรคำสั่ง
สำหรับกรณีการใช้งานขั้นสูง ธงการคอมไพล์เฉพาะซึ่งควบคุมการสร้างไบนารีจะได้รับการบันทึกไว้ใน lib/README.md
สำหรับไลบรารี libzstd
และใน programs/README.md
สำหรับ zstd
CLI
ตัวสร้างโปรเจ็กต์ cmake
มีให้ภายใน build/cmake
โดยสามารถสร้าง Makefiles หรือสคริปต์บิลด์อื่นๆ เพื่อสร้างไลบรารี่ zstd
binary และ libzstd
dynamic และ static
ตามค่าเริ่มต้น 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 ในการสร้างโปรเจ็กต์นี้
โปรดทราบว่าประเภทบิลด์เริ่มต้นคือ release
คุณสามารถสร้างและติดตั้งตัวจัดการการพึ่งพา 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 ได้รับการปรับปรุงให้ทันสมัยโดยผู้ดูแลโคนันและผู้ร่วมให้ข้อมูลในชุมชน หากเวอร์ชันล้าสมัย โปรดสร้างปัญหาหรือดึงคำขอบนที่เก็บ ConanCenterIndex
เมื่อเข้าไปในไดเร็กทอรี build
คุณจะพบความเป็นไปได้เพิ่มเติม:
build/VS_scripts
ซึ่งจะสร้างไลบรารี zstd
cli และ libzstd
โดยไม่จำเป็นต้องเปิดโซลูชัน Visual Studio คุณสามารถสร้างไบนารี zstd ผ่าน buck ได้โดยดำเนินการ: buck build programs:zstd
จากรูทของ repo ไบนารีเอาต์พุตจะอยู่ใน buck-out/gen/programs/
คุณสามารถรวม zstd เข้ากับโปรเจ็กต์ Bazel ของคุณได้อย่างง่ายดายโดยใช้โมดูลที่โฮสต์บน Bazel Central Repository
คุณสามารถเรียกใช้การทดสอบควันในพื้นที่อย่างรวดเร็วได้โดยการเรียกใช้ 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
โดยตรง สำหรับข้อมูลเพิ่มเติม โปรดอ่านการมีส่วนร่วม