如何创建字典对象以传递给 Zstd.compress?

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)

就这样!