Skip to content

Commit 7a742e6

Browse files
laramielcopybara-github
authored andcommitted
Add n5/zstd compression documentation
Update default behavior to be more consistent with other encoders and use level=3. Updated test compression string so that there is a difference between 1 and 3, for example. Fixes: #219 PiperOrigin-RevId: 733175947 Change-Id: If40018c80e9c052c91fb687982aa33b43da9d4fb
1 parent f2a81b6 commit 7a742e6

File tree

5 files changed

+63
-13
lines changed

5 files changed

+63
-13
lines changed

tensorstore/driver/n5/BUILD

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -400,9 +400,10 @@ tensorstore_cc_test(
400400
deps = [
401401
":compressor",
402402
":zstd_compressor",
403-
"//tensorstore/internal:json_gtest",
404-
"//tensorstore/util:status",
405403
"//tensorstore/util:status_testutil",
404+
"@com_github_nlohmann_json//:json",
405+
"@com_google_absl//absl/status",
406+
"@com_google_absl//absl/strings:cord",
406407
"@com_google_googletest//:gtest_main",
407408
],
408409
)

tensorstore/driver/n5/index.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ The following compression methods are supported:
2121
.. json:schema:: driver/n5/Compression/bzip2
2222
.. json:schema:: driver/n5/Compression/xz
2323
.. json:schema:: driver/n5/Compression/blosc
24+
.. json:schema:: driver/n5/Compression/zstd
2425
2526
Mapping to TensorStore Schema
2627
-----------------------------

tensorstore/driver/n5/schema.yml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,24 @@ definitions:
206206
compression with the worst compression ratio, while preset 9
207207
corresponds to the slowest compression with the best compression
208208
ratio.
209+
compression-zstd:
210+
$id: 'driver/n5/Compression/zstd'
211+
description: Specifies `zstd <https://github.com/facebook/zstd>`_ compression.
212+
allOf:
213+
- $ref: driver/n5/Compression
214+
- type: object
215+
properties:
216+
type:
217+
const: zstd
218+
level:
219+
type: integer
220+
maximum: 22
221+
default: 0
222+
description: |
223+
Specifies the zstd compression level to use. Level 1 is the fastest compression with
224+
the worst compression ratio, while level 22 is the slowest compression with the best
225+
compression ratio. Level 0 uses the zstd default compression level (equal to 3).
226+
Negative values are also supported per the zstd specification.
209227
compression-blosc:
210228
$id: 'driver/n5/Compression/blosc'
211229
description: Specifies `Blosc <https://github.com/Blosc/c-blosc>`_ compression.

tensorstore/driver/n5/zstd_compressor.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ struct Registration {
4040
jb::Projection(
4141
&ZstdCompressor::level,
4242
jb::DefaultValue<jb::kAlwaysIncludeDefaults>(
43-
[](auto* v) { *v = 1; },
43+
[](auto* v) { *v = 0; },
4444
jb::Integer<int>(
4545
ZstdWriterBase::Options::kMinCompressionLevel,
4646
ZstdWriterBase::Options::kMaxCompressionLevel))))));

tensorstore/driver/n5/zstd_compressor_test.cc

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,45 +14,75 @@
1414

1515
#include <gmock/gmock.h>
1616
#include <gtest/gtest.h>
17+
#include "absl/status/status.h"
18+
#include "absl/strings/cord.h"
19+
#include <nlohmann/json.hpp>
1720
#include "tensorstore/driver/n5/compressor.h"
18-
#include "tensorstore/internal/json_gtest.h"
19-
#include "tensorstore/util/status.h"
2021
#include "tensorstore/util/status_testutil.h"
2122

2223
namespace {
2324

2425
using ::tensorstore::MatchesStatus;
2526
using ::tensorstore::internal_n5::Compressor;
2627

28+
absl::Cord GetInput() {
29+
return absl::Cord(
30+
"Sed ut perspiciatis unde omnis iste natus error sit voluptatem "
31+
"accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae "
32+
"ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt "
33+
"explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut "
34+
"odit aut fugit, sed quia consequuntur magni dolores eos qui ratione "
35+
"voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum "
36+
"quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam "
37+
"eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat "
38+
"voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam "
39+
"corporis suscipit laboriosam, nisi ut aliquid ex ea commodi "
40+
"consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate "
41+
"velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum "
42+
"fugiat quo voluptas nulla pariatur?");
43+
}
44+
2745
// Tests that a small input round trips.
2846
TEST(ZstdCompressorTest, SmallRoundtrip) {
2947
auto compressor =
3048
Compressor::FromJson({{"type", "zstd"}, {"level", 6}}).value();
31-
const absl::Cord input("The quick brown fox jumped over the lazy dog.");
49+
const absl::Cord input = GetInput();
3250
absl::Cord encode_result, decode_result;
33-
TENSORSTORE_ASSERT_OK(compressor->Encode(input, &encode_result, 1));
51+
TENSORSTORE_ASSERT_OK(compressor->Encode(GetInput(), &encode_result, 1));
3452
TENSORSTORE_ASSERT_OK(compressor->Decode(encode_result, &decode_result, 1));
3553
EXPECT_EQ(input, decode_result);
3654
}
3755

38-
// Tests that specifying a level of 1 gives the same result as not specifying a
56+
// Tests that specifying a level of 3 gives the same result as not specifying a
3957
// level.
4058
TEST(ZstdCompressorTest, DefaultLevel) {
4159
auto compressor1 = Compressor::FromJson({{"type", "zstd"}}).value();
4260
auto compressor2 =
43-
Compressor::FromJson({{"type", "zstd"}, {"level", 1}}).value();
44-
const absl::Cord input("The quick brown fox jumped over the lazy dog.");
61+
Compressor::FromJson({{"type", "zstd"}, {"level", 3}}).value();
62+
const absl::Cord input = GetInput();
4563
absl::Cord encode_result1, encode_result2;
4664
TENSORSTORE_ASSERT_OK(compressor1->Encode(input, &encode_result1, 1));
4765
TENSORSTORE_ASSERT_OK(compressor2->Encode(input, &encode_result2, 1));
4866
EXPECT_EQ(encode_result1, encode_result2);
4967
}
5068

51-
// Tests that specifying a level of 9 works.
69+
// Tests that the default level is different from level 1.
5270
TEST(ZstdCompressorTest, NonDefaultLevel) {
71+
auto compressor1 = Compressor::FromJson({{"type", "zstd"}}).value();
72+
auto compressor2 =
73+
Compressor::FromJson({{"type", "zstd"}, {"level", 1}}).value();
74+
const absl::Cord input = GetInput();
75+
absl::Cord encode_result1, encode_result2;
76+
TENSORSTORE_ASSERT_OK(compressor1->Encode(input, &encode_result1, 1));
77+
TENSORSTORE_ASSERT_OK(compressor2->Encode(input, &encode_result2, 1));
78+
EXPECT_NE(encode_result1, encode_result2);
79+
}
80+
81+
// Tests that specifying a level 22 works.
82+
TEST(ZstdCompressorTest, Level22) {
5383
auto compressor =
54-
Compressor::FromJson({{"type", "zstd"}, {"level", 9}}).value();
55-
const absl::Cord input("The quick brown fox jumped over the lazy dog.");
84+
Compressor::FromJson({{"type", "zstd"}, {"level", 22}}).value();
85+
const absl::Cord input = GetInput();
5686
absl::Cord encode_result;
5787
TENSORSTORE_ASSERT_OK(compressor->Encode(input, &encode_result, 1));
5888
absl::Cord decode_result;

0 commit comments

Comments
 (0)