我需要在多个进程之间共享HDF5文件中的大型数据集,出于一系列原因,mmap不是一个选项.

因此,我将其读入一个NumPy数组,然后将该数组复制到共享内存中,如下所示:

import h5py
from multiprocessing import shared_memory

dataset = h5py.File(args.input)['data']
shm = shared_memory.SharedMemory(
    name=memory_label,
    create=True,
    size=dataset.nbytes
)
shared_tracemap = np.ndarray(dataset.shape, buffer=shm.buf)
shared_tracemap[:] = dataset[:]

但是这种方法会使所需的内存量加倍,因为我需要使用临时变量.有没有办法将数据集直接读入SharedMemory?

推荐答案

首先,注意到:在您的代码中,dataset是一个h5py DataSet对象,而不是一个NumPyarray.它不会将整个数据集加载到内存中!

正如@星期一的 comments 所说,read_direct()直接从HDF5数据集读取到NumPyarray.使用它可以避免在切片时制作中间副本.

下面是如何将其添加到您的代码中.(请注意,我建议在您的np.ndarray()呼叫中包含dtype关键字.)

shared_tracemap = np.ndarray(dataset.shape, dtype=dataset.dtype, buffer=shm.buf)
dataset.read_direct(shared_tracemap)

您可以使用source_sel=dest_sel=关键字从数据集中读取切片.示例:

dataset.read_direct(shared_tracemap,source_sel=np.s_[0:100],dest_sel=np.s_[0:100])

Python相关问答推荐

根据不同列的值在收件箱中移动数据

为什么符号没有按顺序添加?

在Polars(Python库)中将二进制转换为具有非UTF-8字符的字符串变量

把一个pandas文件夹从juyter笔记本放到堆栈溢出问题中的最快方法?

如何启动下载并在不击中磁盘的情况下呈现响应?

如何禁用FastAPI应用程序的Swagger UI autodoc中的application/json?

Tkinter菜单自发添加额外项目

lityter不让我输入左边的方括号,'

在不同的帧B中判断帧A中的子字符串,每个帧的大小不同

计算空值

处理Gekko的非最优解

python的文件. truncate()意外地没有截断'

你能把函数的返回类型用作其他地方的类型吗?'

如何使用大量常量优化代码?

按条件计算将记录拆分成两条记录

有没有一种方法可以在朗肯代理中集成向量嵌入

Numpy`astype(Int)`给出`np.int64`而不是`int`-怎么办?

当lambda函数作为参数传递时,pyo3执行

try 使用RegEx解析由标识多行文本数据的3行头组成的日志(log)文件

Fake pathlib.使用pyfakefs的类变量中的路径'