Skip to content

Commit 098dfc7

Browse files
Set the zstd compression level when creating the VCF dataset (#568) (#569)
Co-authored-by: George Powley <george.powley@gmail.com>
1 parent 6f1071a commit 098dfc7

12 files changed

Lines changed: 81 additions & 5 deletions

File tree

apis/python/src/tiledbvcf/binding/libtiledbvcf.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,5 +114,6 @@ PYBIND11_MODULE(libtiledbvcf, m) {
114114
.def("set_contig_mode", &Writer::set_contig_mode)
115115
.def("set_enable_allele_count", &Writer::set_enable_allele_count)
116116
.def("set_enable_variant_stats", &Writer::set_enable_variant_stats)
117-
.def("set_compress_sample_dim", &Writer::set_compress_sample_dim);
117+
.def("set_compress_sample_dim", &Writer::set_compress_sample_dim)
118+
.def("set_compression_level", &Writer::set_compression_level);
118119
}

apis/python/src/tiledbvcf/binding/writer.cc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,4 +347,9 @@ void Writer::set_compress_sample_dim(bool enable) {
347347
writer, tiledb_vcf_writer_set_compress_sample_dim(writer, enable));
348348
}
349349

350+
void Writer::set_compression_level(int level) {
351+
auto writer = ptr.get();
352+
check_error(writer, tiledb_vcf_writer_set_compression_level(writer, level));
353+
}
354+
350355
} // namespace tiledbvcfpy

apis/python/src/tiledbvcf/binding/writer.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,11 @@ class Writer {
235235
*/
236236
void set_compress_sample_dim(bool enable);
237237

238+
/**
239+
Set zstd compression level
240+
*/
241+
void set_compression_level(int level);
242+
238243
private:
239244
/** Helper function to free a C writer instance */
240245
static void deleter(tiledb_vcf_writer_t* w);

apis/python/src/tiledbvcf/dataset.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -569,6 +569,7 @@ def create_dataset(
569569
enable_allele_count: bool = True,
570570
enable_variant_stats: bool = True,
571571
compress_sample_dim: bool = True,
572+
compression_level: int = 4,
572573
):
573574
"""
574575
Create a new dataset.
@@ -593,6 +594,8 @@ def create_dataset(
593594
Enable the variant stats ingestion task.
594595
compress_sample_dim
595596
Enable compression on the sample dimension.
597+
compression_level
598+
Compression level for zstd compression.
596599
"""
597600
if self.mode != "w":
598601
raise Exception("Dataset not open in write mode")
@@ -629,6 +632,9 @@ def create_dataset(
629632
if compress_sample_dim is not None:
630633
self.writer.set_compress_sample_dim(compress_sample_dim)
631634

635+
if compression_level is not None:
636+
self.writer.set_compression_level(compression_level)
637+
632638
# This call throws an exception if the dataset already exists.
633639
self.writer.create_dataset()
634640

apis/python/tests/test_tiledbvcf.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1366,3 +1366,22 @@ def test_sample_compression(tmp_path, compress):
13661366
found_zstd = found_zstd or "Zstd" in str(filter)
13671367

13681368
assert found_zstd == compress
1369+
1370+
1371+
@pytest.mark.parametrize("level", [1, 4, 16, 22])
1372+
def test_compression_level(tmp_path, level):
1373+
# Create the dataset
1374+
dataset_uri = os.path.join(tmp_path, "compression_level")
1375+
array_uri = os.path.join(dataset_uri, "data")
1376+
ds = tiledbvcf.Dataset(dataset_uri, mode="w")
1377+
ds.create_dataset(compression_level=level)
1378+
1379+
check_if_compatible(array_uri)
1380+
1381+
# Check for the expected compression level
1382+
with tiledb.open(array_uri) as A:
1383+
for i in range(A.schema.nattr):
1384+
attr = A.schema.attr(i)
1385+
for filter in attr.filters:
1386+
if "Zstd" in str(filter):
1387+
assert filter.level == level

libtiledbvcf/src/c_api/tiledbvcf.cc

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1663,6 +1663,17 @@ int32_t tiledb_vcf_writer_set_compress_sample_dim(
16631663
return TILEDB_VCF_OK;
16641664
}
16651665

1666+
int32_t tiledb_vcf_writer_set_compression_level(
1667+
tiledb_vcf_writer_t* writer, int level) {
1668+
if (sanity_check(writer) == TILEDB_VCF_ERR)
1669+
return TILEDB_VCF_ERR;
1670+
1671+
if (SAVE_ERROR_CATCH(writer, writer->writer_->set_compression_level(level)))
1672+
return TILEDB_VCF_ERR;
1673+
1674+
return TILEDB_VCF_OK;
1675+
}
1676+
16661677
/* ********************************* */
16671678
/* ERROR */
16681679
/* ********************************* */

libtiledbvcf/src/c_api/tiledbvcf.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1602,6 +1602,14 @@ TILEDBVCF_EXPORT int32_t tiledb_vcf_writer_set_enable_variant_stats(
16021602
TILEDBVCF_EXPORT int32_t tiledb_vcf_writer_set_compress_sample_dim(
16031603
tiledb_vcf_writer_t* writer, bool enable);
16041604

1605+
/**
1606+
* Sets zstd compression level
1607+
* @param writer VCF writer object
1608+
* @param level compression level
1609+
*/
1610+
TILEDBVCF_EXPORT int32_t
1611+
tiledb_vcf_writer_set_compression_level(tiledb_vcf_writer_t* writer, int level);
1612+
16051613
/* ********************************* */
16061614
/* ERROR */
16071615
/* ********************************* */

libtiledbvcf/src/cli/tiledbvcf.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,10 @@ void add_create(CLI::App& app) {
441441
args->compress_sample_dim,
442442
"Enable/disable compression of the sample dimension. Enabled by "
443443
"default.");
444+
cmd->add_option(
445+
"--compression-level",
446+
args->compression_level,
447+
"Set zstd compression level.");
444448

445449
cmd->option_defaults()->group("Ingestion task options");
446450
cmd->add_flag(

libtiledbvcf/src/dataset/tiledbvcfdataset.cc

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,8 @@ void TileDBVCFDataset::create(const CreationParams& params) {
251251
metadata,
252252
params.checksum,
253253
params.allow_duplicates,
254-
params.compress_sample_dim);
254+
params.compress_sample_dim,
255+
params.compression_level);
255256

256257
if (params.enable_allele_count) {
257258
AlleleCount::create(ctx, params.uri, params.checksum);
@@ -330,7 +331,8 @@ void TileDBVCFDataset::create_empty_data_array(
330331
const Metadata& metadata,
331332
const tiledb_filter_type_t& checksum,
332333
const bool allow_duplicates,
333-
const bool compress_sample_dim) {
334+
const bool compress_sample_dim,
335+
const int compression_level) {
334336
ArraySchema schema(ctx, TILEDB_SPARSE);
335337
schema.set_capacity(metadata.tile_capacity);
336338
schema.set_order({{TILEDB_ROW_MAJOR, TILEDB_ROW_MAJOR}});
@@ -345,8 +347,14 @@ void TileDBVCFDataset::create_empty_data_array(
345347
FilterList float_attr_filters(ctx);
346348
FilterList byte_attr_filters(ctx);
347349

350+
// Use tile level filtering
351+
str_attr_filters.set_max_chunk_size(0);
352+
int_attr_filters.set_max_chunk_size(0);
353+
float_attr_filters.set_max_chunk_size(0);
354+
byte_attr_filters.set_max_chunk_size(0);
355+
348356
Filter compression(ctx, TILEDB_FILTER_ZSTD);
349-
compression.set_option(TILEDB_COMPRESSION_LEVEL, 4);
357+
compression.set_option(TILEDB_COMPRESSION_LEVEL, compression_level);
350358

351359
contig_coord_filters.add_filter({ctx, TILEDB_FILTER_RLE});
352360
pos_coord_filters.add_filter({ctx, TILEDB_FILTER_DOUBLE_DELTA})

libtiledbvcf/src/dataset/tiledbvcfdataset.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ struct CreationParams {
6666
bool enable_allele_count = true;
6767
bool enable_variant_stats = true;
6868
bool compress_sample_dim = true;
69+
int compression_level = 4;
6970
};
7071

7172
/** Arguments/params for dataset registration. */
@@ -872,7 +873,8 @@ class TileDBVCFDataset {
872873
const Metadata& metadata,
873874
const tiledb_filter_type_t& checksum,
874875
const bool allow_duplicates,
875-
const bool compress_sample_dim);
876+
const bool compress_sample_dim,
877+
const int compression_level);
876878

877879
/**
878880
* Creates the empty sample header array for a new dataset.

0 commit comments

Comments
 (0)