我有一个4维numpy数组的堆栈,保存为.npy
文件。每一个大约1.5GB,我有240个文件,所以大约360 GB的总数和比内存大得多。我想把它们组合成Google云存储桶中的一个Zarr数组。
我的第一次尝试是初始化第一个维度中为空的zarr数组,如下所示
z = zarr.open(
gcsfs.GCSFileSystem(project=<project-name>).get_mapper(<bucket-name>),
mode='w',
shape=(0,256,1440,3),
dtype=np.float32
)
然后读取每个1.5GB文件并将其append
到数组中。
for fn in filenames:
z.append(np.load(fn))
这似乎是可行的,但这是极其慢.看起来可能需要好几天..。
我是在谷歌云平台上的虚拟机上这样做的,所以我的个人网络速度不应该成为问题。
是否有一种有效和可行的方法来完成这项任务?也许用一个中间步骤使用dask
?如有任何建议请见谅。
发布于 2022-09-28 13:19:37
假设npy文件都是相同的形状,您可以做的最简单的事情是:
z = zarr.open(
gcsfs.GCSFileSystem(project=<project-name>).get_mapper(<bucket-name>),
mode='w',
shape=(240,256,1440,3),
dtype=np.float32
)
for i, fn in enumerate(filenames):
z[i] = np.load(fn)
当然,这并不使用dask的并行性,但它跳过了元数据的检查和更新,以及追加()必须执行的任何最后块操作。
请注意,这里使用的是默认压缩,blosc。有了这么多数据,当您找到哪种压缩/选项最有效的时候,就很值得了,还可以考虑是否会考虑有损编码来节省带宽和存储成本。
https://stackoverflow.com/questions/73875277
复制相似问题