h5py 可以从内存中的字节数组加载文件吗?

Posted

技术标签:

【中文标题】h5py 可以从内存中的字节数组加载文件吗?【英文标题】:Can h5py load a file from a byte array in memory? 【发布时间】:2013-05-15 06:58:08 【问题描述】:

我的 python 代码正在接收一个字节数组,它代表 hdf5 文件的字节。

我想将此字节数组读取到内存中的 h5py 文件对象,而无需先将字节数组写入磁盘。 This page 说我可以打开一个内存映射文件,但它会是一个新的空文件。我想从字节数组到内存中的 hdf5 文件,使用它,丢弃它,而不是在任何时候写入磁盘。

可以用 h5py 做到这一点吗? (如果这是唯一的方法,或者使用 C 的 hdf5)

【问题讨论】:

我正在尝试做同样的事情。你能用有效的解决方案展示一些代码吗?谢谢! 我找到了解决方案并在此处发布:***.com/questions/11588630/… 还是没有解决吗? This 答案解释了如何从内存中的字节数组中读取 h5 文件。但是如何从文件系统中的给定 h5 文件中获取这样的字节数组。我想在不同于文件系统上有 h5 文件的机器上加载 h5 文件。所以正在考虑将其作为字节流读取并将字节流发送到目标机器,然后从目标机器上的该字节数组加载 h5 文件。可能吗?刚问question 【参考方案1】:

您可以尝试使用Binary I/O 创建一个 File 对象并通过 h5py 读取它:

f = io.BytesIO(YOUR_H5PY_STREAM)
h = h5py.File(f,'r')

【讨论】:

谢谢,这看起来像我需要的 你能分享你的代码在这个解决方案中有效吗? 这适用于我使用h5py==2.10.0tensorflow==2.1.0 直接从从 s3 下载的 .h5 字节流加载模型:` model_file = h5py.File(io.BytesIO(modelbytes), ' r') return tf.keras.models.load_model(model_file)` 谢谢!我错过了h5py.File 部分,我的 h5 方法很生气【参考方案2】:

您可以使用io.BytesIOtempfile 创建h5 对象,在官方文档http://docs.h5py.org/en/stable/high/file.html#python-file-like-objects 中有说明。

File 的第一个参数可以是 Python 文件类对象,例如 io.BytesIO 或 tempfile.TemporaryFile 实例。这是创建临时 HDF5 文件的便捷方式,例如用于测试或通过网络发送。

临时文件.临时文件

>>> tf = tempfile.TemporaryFile()
>>> f = h5py.File(tf)

或 io.BytesIO

"""Create an HDF5 file in memory and retrieve the raw bytes

This could be used, for instance, in a server producing small HDF5
files on demand.
"""
import io
import h5py

bio = io.BytesIO()
with h5py.File(bio) as f:
    f['dataset'] = range(10)

data = bio.getvalue() # data is a regular Python bytes object.
print("Total size:", len(data))
print("First bytes:", data[:10])

【讨论】:

这两个例子在 python3.7 中都失败了。第一个:TypeError: expected str, bytes or os.PathLike object, not _io.BufferedRandom。第二个示例在 ----> 5 with h5py.File(bio) as f 失败:TypeError: expected str, bytes or os.PathLike object, not _io.BytesIO【参考方案3】:

以下示例使用tables,它仍然可以读取和操作 H5 格式来代替 H5PY。

import urllib.request
import tables
url = 'https://s3.amazonaws.com/<your bucket>/data.hdf5'
response = urllib.request.urlopen(url) 
h5file = tables.open_file("data-sample.h5", driver="H5FD_CORE",
                          driver_core_image=response.read(),
                          driver_core_backing_store=0)

【讨论】:

以上是关于h5py 可以从内存中的字节数组加载文件吗?的主要内容,如果未能解决你的问题,请参考以下文章

MFC BYTE[]怎么算字节数

Java IO学习--字节和字符数组

java中的变量各占得字节数

00090_字节输入流InputStream

jpeg 标头的字节数组

.NET 如何测量请求中分配的字节数?