Python zarr何时压缩块并将其推送到底层存储系统?

Python zarr何时压缩块并将其推送到底层存储系统?,python,zarr,Python,Zarr,我正在将数据从一个大文本文件(VCF)读取到一个zarr数组中。代码的总体流程如下所示 以zarr.LMDBStore(…)作为存储: array=zarr.create(…,chunks=(10001000),store=store,…) 对于行数,枚举(文本文件)中的行: 数组[line_num,:]=进程数据(line) 我想知道,zarr什么时候压缩修改过的数组块并将它们推送到底层存储(在本例中是LMDB)?是否每次更新块(即每行)时都会这样做?还是等到一个块被填满/从内存中取出后再这

我正在将数据从一个大文本文件(VCF)读取到一个zarr数组中。代码的总体流程如下所示

以zarr.LMDBStore(…)作为存储:
array=zarr.create(…,chunks=(10001000),store=store,…)
对于行数,枚举(文本文件)中的行:
数组[line_num,:]=进程数据(line)
我想知道,zarr什么时候压缩修改过的数组块并将它们推送到底层存储(在本例中是LMDB)?是否每次更新块(即每行)时都会这样做?还是等到一个块被填满/从内存中取出后再这样做?假设我需要在for循环中分别处理每一行(由于数据和处理的性质,这里没有有效的数组操作可供使用),那么关于如何将数据馈送到Zarr,我应该在这里进行优化吗

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

谢谢

我相信LMDB存储(据我所知)将在每次分配时写入/压缩

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


数据集可能有一个“批处理”选项,但据我所知,它尚未实现。

每次执行这一行时:

         array[line_num, :] = process_data(line)
…zarr将(1)找出哪些区块与要写入的数组区域重叠,(2)从存储中检索这些区块,(3)解压缩区块,(4)修改数据,(5)压缩修改后的区块,(6)将修改后的压缩区块写入存储

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

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

更好的策略是以N行块解析输入文件,其中N等于输出数组每个块中的行数,因此每个块只压缩和写入一次

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