python - zarr 何时压缩块并将其推送到底层存储系统?
问题描述
我正在将大型文本文件(VCF)中的数据读取到 zarr 数组中。代码的整体流程是
with zarr.LMDBStore(...) as store:
array = zarr.create(..., chunks=(1000,1000), store=store, ...)
for line_num, line in enumerate(text_file):
array[line_num, :] = process_data(line)
我想知道 - zarr 何时压缩修改后的数组块并将它们推送到底层存储(在本例中为 LMDB)?每次更新块(即每一行)时都会这样做吗?或者它是否等到一个块被填充/从内存中删除后再这样做?假设我需要在 for 循环中分别处理每一行(由于数据和处理的性质,这里没有有效的数组操作可供使用),关于我如何馈送,我应该在这里做任何优化吗数据导入Zarr?
我只是不希望 Zarr 在每一行对每个修改的块运行压缩,因为每个块在完成并准备保存到磁盘之前将被修改 1000 次。
谢谢!
解决方案
每次执行此行时:
array[line_num, :] = process_data(line)
...zarr 将 (1) 找出哪些块与您要写入的数组区域重叠,(2) 从存储中检索这些块,(3) 解压缩块,(4) 修改数据,(5) 压缩修改后的块,(6)将修改后的压缩块写入存储。
无论您使用什么类型的底层存储,都会发生这种情况。
如果您创建了一个包含超过一行高的块的数组,那么这可能效率低下,导致每个块被读取、解压缩、更新、压缩和写入多次。
更好的策略是将输入文件解析为 N 行块,其中 N 等于输出数组的每个块中的行数,以便每个块只压缩和写入一次。
如果 VCF 是指 Variant Call Format 文件,您可能需要查看 scikit-allel 中的vcf_to_zarr函数实现。
推荐阅读
- python - Python argparse 为空
- sql - 有没有办法结合2个查询?
- javascript - 如何在 Firebase 中实现分布式倒数计时器
- google-play-console - 即使我更改了软件包名称,Google 控制台仍然拒绝我的 aab 文件
- android - 将列表轮视图与图像一起使用时颤动“空值检查运算符”
- python-3.x - 如何从 Pandas 更新 Excel 工作表
- android - 如何将 RSA 公钥转换为字符串,反之亦然?
- python - 无法将大小数组重塑为形状 MoviePy 边距
- android - 尝试生成 ionic 项目的 android 或 ios 构建时出现错误
- arrays - 子功能组件中的状态未更新