Skip to content

Commit 5f14193

Browse files
committed
(feat): writing
1 parent 899e7ee commit 5f14193

File tree

8 files changed

+237
-123
lines changed

8 files changed

+237
-123
lines changed

src/anndata/_io/h5ad.py

Lines changed: 56 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,8 @@
2525
_from_fixed_length_strings,
2626
)
2727
from ..experimental import read_dispatched
28-
from .specs import write_elem
2928
from .specs.methods import sync_async_to_async
30-
from .specs.registry import IOSpec, read_elem_async, write_spec
29+
from .specs.registry import IOSpec, read_elem_async, write_elem_async, write_spec
3130
from .utils import (
3231
H5PY_V3,
3332
_read_legacy_raw,
@@ -83,39 +82,76 @@ def write_h5ad(
8382
f = f["/"]
8483
f.attrs.setdefault("encoding-type", "anndata")
8584
f.attrs.setdefault("encoding-version", "0.1.0")
86-
8785
if "X" in as_dense and isinstance(
8886
adata.X, CSMatrix | BaseCompressedSparseDataset
8987
):
90-
write_sparse_as_dense(f, "X", adata.X, dataset_kwargs=dataset_kwargs)
88+
asyncio.run(
89+
write_sparse_as_dense(f, "X", adata.X, dataset_kwargs=dataset_kwargs)
90+
)
9191
elif not (adata.isbacked and Path(adata.filename) == Path(filepath)):
9292
# If adata.isbacked, X should already be up to date
93-
write_elem(f, "X", adata.X, dataset_kwargs=dataset_kwargs)
93+
asyncio.run(
94+
write_elem_async(f, "X", adata.X, dataset_kwargs=dataset_kwargs)
95+
)
9496
if "raw/X" in as_dense and isinstance(
9597
adata.raw.X, CSMatrix | BaseCompressedSparseDataset
9698
):
97-
write_sparse_as_dense(
98-
f, "raw/X", adata.raw.X, dataset_kwargs=dataset_kwargs
99+
asyncio.run(
100+
write_sparse_as_dense(
101+
f, "raw/X", adata.raw.X, dataset_kwargs=dataset_kwargs
102+
)
99103
)
100-
write_elem(f, "raw/var", adata.raw.var, dataset_kwargs=dataset_kwargs)
101-
write_elem(
102-
f, "raw/varm", dict(adata.raw.varm), dataset_kwargs=dataset_kwargs
104+
asyncio.run(
105+
write_elem_async(
106+
f, "raw/var", adata.raw.var, dataset_kwargs=dataset_kwargs
107+
)
108+
)
109+
asyncio.run(
110+
write_elem_async(
111+
f, "raw/varm", dict(adata.raw.varm), dataset_kwargs=dataset_kwargs
112+
)
103113
)
104114
elif adata.raw is not None:
105-
write_elem(f, "raw", adata.raw, dataset_kwargs=dataset_kwargs)
106-
write_elem(f, "obs", adata.obs, dataset_kwargs=dataset_kwargs)
107-
write_elem(f, "var", adata.var, dataset_kwargs=dataset_kwargs)
108-
write_elem(f, "obsm", dict(adata.obsm), dataset_kwargs=dataset_kwargs)
109-
write_elem(f, "varm", dict(adata.varm), dataset_kwargs=dataset_kwargs)
110-
write_elem(f, "obsp", dict(adata.obsp), dataset_kwargs=dataset_kwargs)
111-
write_elem(f, "varp", dict(adata.varp), dataset_kwargs=dataset_kwargs)
112-
write_elem(f, "layers", dict(adata.layers), dataset_kwargs=dataset_kwargs)
113-
write_elem(f, "uns", dict(adata.uns), dataset_kwargs=dataset_kwargs)
115+
asyncio.run(
116+
write_elem_async(f, "raw", adata.raw, dataset_kwargs=dataset_kwargs)
117+
)
118+
119+
async def gather():
120+
await asyncio.gather(
121+
*[
122+
write_elem_async(
123+
f, "obs", adata.obs, dataset_kwargs=dataset_kwargs
124+
),
125+
write_elem_async(
126+
f, "var", adata.var, dataset_kwargs=dataset_kwargs
127+
),
128+
write_elem_async(
129+
f, "obsm", dict(adata.obsm), dataset_kwargs=dataset_kwargs
130+
),
131+
write_elem_async(
132+
f, "varm", dict(adata.varm), dataset_kwargs=dataset_kwargs
133+
),
134+
write_elem_async(
135+
f, "obsp", dict(adata.obsp), dataset_kwargs=dataset_kwargs
136+
),
137+
write_elem_async(
138+
f, "varp", dict(adata.varp), dataset_kwargs=dataset_kwargs
139+
),
140+
write_elem_async(
141+
f, "layers", dict(adata.layers), dataset_kwargs=dataset_kwargs
142+
),
143+
write_elem_async(
144+
f, "uns", dict(adata.uns), dataset_kwargs=dataset_kwargs
145+
),
146+
]
147+
)
148+
149+
asyncio.run(gather())
114150

115151

116152
@report_write_key_on_error
117153
@write_spec(IOSpec("array", "0.2.0"))
118-
def write_sparse_as_dense(
154+
async def write_sparse_as_dense(
119155
f: h5py.Group,
120156
key: str,
121157
value: CSMatrix | BaseCompressedSparseDataset,

0 commit comments

Comments
 (0)