Skip to content

Commit fd4ea35

Browse files
authored
Merge pull request #226 from mulimoen/bugfix/issue_223
Allow chunking on zero-sized extents
2 parents 66515f1 + e383b6c commit fd4ea35

File tree

3 files changed

+21
-1
lines changed

3 files changed

+21
-1
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
- Fixed a memory leak when opening datasets.
2727
- Avoid creating unaligned references in `H5Type` derive macro.
2828
- Applying filters without chunking will now produce an explicit error.
29+
- Fixed a bug where chunking could not be enabled for zero-sized extents.
2930

3031
## 0.8.1
3132

hdf5/src/hl/dataset.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,8 @@ impl DatasetBuilderInner {
414414
chunk.clone()
415415
} else if chunking_required && chunking_allowed {
416416
Chunk::MinKB(DEFAULT_CHUNK_SIZE_KB)
417+
} else if extents.size() == 0 {
418+
Chunk::Exact(vec![1; extents.ndim()])
417419
} else {
418420
Chunk::None
419421
};
@@ -437,7 +439,13 @@ impl DatasetBuilderInner {
437439
let chunk_size = chunk.iter().product::<usize>();
438440
ensure!(chunk_size > 0, "All chunk dimensions must be positive, got {:?}", chunk);
439441
let dims_ok = extents.iter().zip(chunk).all(|(e, c)| e.max.is_none() || *c <= e.dim);
440-
ensure!(dims_ok, "Chunk dimensions ({:?}) exceed data shape ({:?})", chunk, extents);
442+
let no_extent = extents.size() == 0;
443+
ensure!(
444+
dims_ok || no_extent,
445+
"Chunk dimensions ({:?}) exceed data shape ({:?})",
446+
chunk,
447+
extents
448+
);
441449
}
442450
Ok(chunk_shape)
443451
}

tests/test_dataset.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,17 @@ fn test_create_on_databuilder() {
351351
let _ds = file.new_dataset::<i32>().shape(2).create("ds4").unwrap();
352352
}
353353

354+
#[test]
355+
fn test_issue_223() {
356+
let file = new_in_memory_file().unwrap();
357+
358+
let data: &[u16] = &[];
359+
let _ds = file.new_dataset_builder().deflate(3).with_data(data).create("ds2").unwrap();
360+
361+
let data: Array2<u16> = Array2::from_shape_fn((0, 0), |(_i, _j)| unreachable!());
362+
let _ds = file.new_dataset_builder().deflate(3).with_data(&data).create("ds3").unwrap();
363+
}
364+
354365
#[test]
355366
fn test_read_write_rename_fields() -> hdf5::Result<()> {
356367
test_read_write::<RenameStruct>()?;

0 commit comments

Comments
 (0)