A. *_*esh 3 java compression dictionary zstd
我在 Java 中使用 Zstd 压缩来压缩大型 JSON 有效负载。我正在使用 Java 的 zstd-jni 库中的方法。我从 JSON 字符串创建一个字节数组并使用此方法。
公共静态字节[]压缩(字节[] var0,int var1)
我读到,在压缩和解压缩期间传递字典时,ZSTD 会给出更优化的结果。如何创建 ZstdDictCompress 对象?我应该将什么字节数组和整数传递给构造函数?
公共静态长压缩(字节[] var0,字节[] var1,ZstdDictCompress var2)
小智 8
此示例适用于https://github.com/luben/zstd-jni。
首先,您需要获取许多 json 样本。您不应该只使用一个或几个样本。之后你可以训练你的字典:
List<String> jsons = ...; // List of your jsons samples
ZstdDictTrainer trainer = new ZstdDictTrainer(1024 * 1024, 16 * 1024); // 16 KB dictionary
for(String json : jsons) {
trainer.addSample(json.getBytes(StandardCharsets.UTF_8));
}
byte[] dictionary = trainer.trainSamples();
Run Code Online (Sandbox Code Playgroud)
现在你有了字节数组中的字典。
下一步是使用相同的字典来压缩和解压缩。
// Compress
byte[] json = jsonString.getBytes(StandardCharsets.UTF_8);
ZstdDictCompress zstdDictCompress = new ZstdDictCompress(dictionary, Zstd.defaultCompressionLevel());
byte[] compressed = Zstd.compress(json, zstdDictCompress);
// Tricky moment, you have to pass json full length to decompress method
int jsonFullLength = json.length;
// Decompress
ZstdDictDecompress zstdDictDecompress = new ZstdDictDecompress(dictionary);
byte[] decompressed = Zstd.decompress(compressed, zstdDictDecompress, jsonFullLength);
String jsonString2 = new String(decompressed, StandardCharsets.UTF_8);
Run Code Online (Sandbox Code Playgroud)
就这样!