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 函数实现。
我正在将大型文本文件 (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 函数实现。