zarr什么时候压缩一个chunk然后推送到底层存储系统?

When does zarr compress a chunk and push it to the underlying storage system?

我正在将大型文本文件 (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)?每次更新一个块(即每一行)时它都会这样做吗?还是等到一个块从内存中 filled/evicted 才开始?假设我需要在 for 循环中单独处理每一行(由于数据和处理的性质,这里没有有效的数组操作),我应该在这里做一些关于我如何喂食的优化将数据导入 Zarr?

我只是不希望 Zarr 运行 对每个修改后的块每一行进行压缩,因为每个块在完成并准备好保存到磁盘之前将被修改 1000 次。

谢谢!

我相信 LMDB 存储(据我所知)会在您每次分配时 write/compress。

您可以在内存中的 Zarr 中聚合您的行,然后为每个块分配。

数据集可能有一个 "batch" 选项,但据我所知还没有实现。

每次执行此行时:

         array[line_num, :] = process_data(line)

...zarr 将 (1) 找出哪些块与您要写入的数组区域重叠,(2) 从存储中检索这些块,(3) 解压缩块,(4) 修改数据, (5) 压缩修改后的chunks, (6) 将修改后的压缩chunks写入store.

无论您使用何种类型的底层存储,都会发生这种情况。

如果您创建的数组包含超过一行的块,那么这可能效率低下,导致每个块被读取、解压缩、更新、压缩和写入多次。

更好的策略是以 N 行为单位解析输入文件,其中 N 等于输出数组每个块中的行数,以便每个块仅压缩和写入一次。

如果 VCF 指的是变体调用格式文件,您可能需要查看 scikit-allel 中的 vcf_to_zarr 函数实现。