Ruby binding for zstd(Zstandard - Fast real-time compression algorithm)
See https://github.com/facebook/zstd
Fork from https://github.com/jarredholman/ruby-zstd.
Add this line to your application's Gemfile:
gem'zstd-ruby'And then execute:
$ bundle
Or install it yourself as:
$ gem install zstd-ruby
require'zstd-ruby'compressed_data=Zstd.compress(data)compressed_data=Zstd.compress(data,level: complession_level)# default compression_level is 3# dictionary is supposed to have been created using `zstd --train`compressed_using_dict=Zstd.compress("",dict: File.read('dictionary_file'))If you use the same dictionary repeatedly, you can speed up the setup by creating CDict in advance:
cdict=Zstd::CDict.new(File.read('dictionary_file'))compressed_using_dict=Zstd.compress("",dict: cdict)The compression_level can be specified on creating CDict.
cdict=Zstd::CDict.new(File.read('dictionary_file'),5)compressed_using_dict=Zstd.compress("",dict: cdict)stream=Zstd::StreamingCompress.newstream << "abc" << "def"res=stream.flushstream << "ghi"res << stream.finishor
stream=Zstd::StreamingCompress.newres=stream.compress("abc")res << stream.flushres << stream.compress("def")res << stream.finishstream=Zstd::StreamingCompress.new(dict: File.read('dictionary_file'))stream << "abc" << "def"res=stream.flushstream << "ghi"res << stream.finishstream=Zstd::StreamingCompress.new(level: 5,dict: File.read('dictionary_file'))stream << "abc" << "def"res=stream.flushstream << "ghi"res << stream.finishcdict=Zstd::CDict.new(File.read('dictionary_file',5)stream=Zstd::StreamingCompress.new(dict: cdict)stream << "abc" << "def"res=stream.flushstream << "ghi"res << stream.finishdata=Zstd.decompress(compressed_data)# dictionary is supposed to have been created using `zstd --train`Zstd.decompress(compressed_using_dict,dict: File.read('dictionary_file'))If you use the same dictionary repeatedly, you can speed up the setup by creating DDict in advance:
cdict=Zstd::CDict.new(File.read('dictionary_file'))compressed_using_dict=Zstd.compress(compressed_using_dict,ddict)cstr=""# Compressed datastream=Zstd::StreamingDecompress.newresult=''result << stream.decompress(cstr[0,10])result << stream.decompress(cstr[10..-1])cstr=""# Compressed datastream=Zstd::StreamingDecompress.new(dict: File.read('dictionary_file'))result=''result << stream.decompress(cstr[0,10])result << stream.decompress(cstr[10..-1])DDict can also be specified to dict:.
compressed_data_with_skippable_frame=Zstd.write_skippable_frame(compressed_data,"sample data")Zstd.read_skippable_frame(compressed_data_with_skippable_frame)# => "sample data"EXPERIMENTAL
- These features are experimental and may be subject to API changes in future releases.
- There may be performance and compatibility issues, so extensive testing is required before production use.
- If you have any questions, encounter bugs, or have suggestions, please report them via GitHub issues.
require'stringio'require'zstd-ruby'io=StringIO.newstream=Zstd::StreamWriter.new(io)stream.write("abc")stream.finishio.rewind# Retrieve the compressed datacompressed_data=io.readrequire'stringio'require'zstd-ruby'# Add the appropriate require statement if necessaryio=StringIO.new(compressed_data)reader=Zstd::StreamReader.new(io)# Read and output the decompressed dataputsreader.read(10)# 'abc'putsreader.read(10)# 'def'putsreader.read(10)# '' (end of data)This gem does not support JRuby.
Please consider using https://github.com/luben/zstd-jni.
Sample code is below.
require 'java'
require_relative './zstd-jni-1.5.2-3.jar'
str = "testtest"
compressed = com.github.luben.zstd.Zstd.compress(str.to_java_bytes)
puts com.github.luben.zstd.Zstd.decompress(compressed, str.length)
% ls
test.rb zstd-jni-1.5.2-3.jar
% ruby -v
jruby 9.3.2.0 (2.6.8) 2021-12-01 0b8223f905 OpenJDK 64-Bit Server VM 11.0.12+0 on 11.0.12+0 +jit [darwin-x86_64]
% ruby test.rb
testtest
After checking out the repo, run bin/setup to install dependencies. Then, run rake spec to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.
To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and tags, and push the .gem file to rubygems.org.
Bug reports and pull requests are welcome on GitHub at https://github.com/SpringMT/zstd-ruby. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.
The gem is available as open source under the terms of the BSD-3-Clause License.