首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dask:读取hdf5并写入其他hdf5文件

Dask:读取hdf5并写入其他hdf5文件
EN

Stack Overflow用户
提问于 2022-07-07 08:50:07
回答 1查看 163关注 0票数 0

我正在处理一个比内存更大的hdf5文件。因此,我试图使用dask来修改它。我的目标是加载文件,做一些修改(不一定要保持形状),并将其保存到其他文件中。我创建我的文件时:

代码语言:javascript
复制
import h5py as h5
import numpy as np

source_file = "source.hdf5"
x = np.zeros((3, 3))  # In practice, x will be larger than memory
with h5.File(source_file, "w") as f:
    f.create_dataset("/x", data=x, compression="gzip")

然后,我使用以下代码加载、修改和保存它。

代码语言:javascript
复制
from dask import array as da
import h5py as h5
from dask.distributed import Client


if __name__ == "__main__":
    dask_client = Client(n_workers=1)  # No need to parallelize, just interested in dask for memory-purposes

    source_file = "source.hdf5"
    temp_filename = "target.hdf5"

    # Load dataframe
    f = h5.File(source_file, "r")
    x_da = da.from_array(f["/x"])

    # Do some modifications
    x_da = x_da * 2

    # Save to target
    x_da.to_hdf5(temp_filename, "/x", compression="gzip")

    # Close original file
    f.close()

但是,这会产生以下错误:

TypeError: ('Could not serialize object of type Dataset.', '<HDF5 dataset "x": shape (3, 3), type "<f8">') distributed.comm.utils - ERROR - ('Could not serialize object of type Dataset.', '<HDF5 dataset "x": shape (3, 3), type "<f8">')

我是不是做错了什么,还是根本不可能?如果是的话,有什么解决办法吗?

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-07 12:24:12

对于感兴趣的人,我创建了一个解决方案,只需在每个块上调用compute()即可。只是分享一下,尽管我仍然对一个更好的解决方案感兴趣。

代码语言:javascript
复制
def to_hdf5(x, filename, datapath):
    """
    Appends dask array to hdf5 file
    """
    with h5.File(filename, "a") as f:
        dset = f.require_dataset(datapath, shape=x.shape, dtype=x.dtype)

        for block_ids in product(*[range(num) for num in x.numblocks]):
            pos = [sum(x.chunks[dim][0 : block_ids[dim]]) for dim in range(len(block_ids))]
            block = x.blocks[block_ids]
            slices = tuple(slice(pos[i], pos[i] + block.shape[i]) for i in range(len(block_ids)))
            dset[slices] = block.compute()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72894869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档