Skip to content

Commit bf458d0

Browse files
authored
fix: correct stream implementation when dataset is empty (#103)
For saving and loading
1 parent 6054fe9 commit bf458d0

File tree

2 files changed

+32
-0
lines changed

2 files changed

+32
-0
lines changed

cryosparc/dataset.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -685,6 +685,9 @@ def _load_stream(
685685
# Calling addrows separately to minimizes column-based
686686
# allocations, improves performance by ~20%
687687
dset = cls.allocate(0, descr)
688+
if header["length"] == 0:
689+
return dset # no more data to load
690+
688691
data = dset._data
689692
data.addrows(header["length"])
690693
loader = Stream(data)
@@ -799,6 +802,9 @@ def stream(self, compression: Literal["lz4", None] = None) -> Generator[bytes, N
799802
yield u32bytesle(len(header))
800803
yield header
801804

805+
if len(self) == 0:
806+
return # empty dataset, don't yield anything
807+
802808
for f in self:
803809
fielddata: "MemoryView"
804810
if f in compressed_fields:

tests/test_dataset.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,27 @@ def small_dset_stream(small_dset):
5656
return stream
5757

5858

59+
@pytest.fixture
60+
def empty_dset():
61+
field3 = "long/fieldwithsuperduperlongcolumnnamethatislongandtestable"
62+
return Dataset.allocate(
63+
0,
64+
fields=[
65+
("field/1", "u8", (2,)),
66+
("field/2", "f4"),
67+
(field3, "O"),
68+
],
69+
)
70+
71+
72+
@pytest.fixture
73+
def empty_dset_stream(empty_dset):
74+
stream = BytesIO()
75+
empty_dset.save(stream, format=CSDAT_FORMAT)
76+
stream.seek(0)
77+
return stream
78+
79+
5980
def test_allocate():
6081
storage = Dataset.allocate(size=2000000, fields=[("field1", "u8"), ("field2", "f4"), ("field3", "O")])
6182
assert storage is not None
@@ -270,6 +291,11 @@ def test_load_stream_fields(small_dset, small_dset_stream):
270291
assert result == small_dset.filter_fields(["field/2"], copy=True)
271292

272293

294+
def test_load_empty_stream(empty_dset, empty_dset_stream):
295+
result = Dataset.load(empty_dset_stream)
296+
assert result == empty_dset
297+
298+
273299
def test_pickle_unpickle():
274300
import pickle
275301

0 commit comments

Comments
 (0)