首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >哪里是h5py性能瓶颈?

哪里是h5py性能瓶颈?
EN

Stack Overflow用户
提问于 2021-04-25 13:31:06
回答 1查看 524关注 0票数 2

我有一个带有100个“事件”的HDF5。每个事件包含变量,但大约有180个组称为“跟踪”,每个跟踪都包含6个数据集,这些数据集由32位浮点数组成,每个单元格长度为1000个(这在每个事件之间略为携带,但在事件中保持不变)。该文件是用默认的h5py设置生成的(因此,除非h5py自己执行,否则不会分块或压缩)。

读数不快。它比从CERN根TTrees读取相同数据的速度慢6倍。我知道HDF5不是市场上最快的格式,但如果您能告诉我速度在哪里丢失,我将不胜感激。

若要以跟踪方式读取数组,请执行以下操作:

代码语言:javascript
运行
复制
    d0keys = data["Run_0"].keys()
    for key_1 in d0keys:
        if("Event_" in key_1):
            d1 = data["Run_0"][key_1]
            d1keys = d1.keys()
            for key_2 in d1keys:
                if("Traces_" in key_2):
                    d2 = d1[key_2]
                    v1, v2, v3, v4, v5, v6 = d2['SimSignal_X'][0],d2['SimSignal_Y'][0],d2['SimSignal_Z'][0],d2['SimEfield_X'][0], d2['SimEfield_Y'][0],d2['SimEfield_Z'][0]

行分析器显示,97%的时间花在最后一行。现在,有两个问题:

  1. 看来,阅读细胞与所有的1000细胞没有差别。我知道h5py应该能够从磁盘中读取一小块数据。为什么没有来自HDD (Linux,ext4)的ext4 100事件,h5py需要30 s,根需要5 s。100个事件的大小大约为430 MB。这使得读出速度在14 MBps,而根是86 MBps。两者都很慢,但根的读取速度比我预期的要快得多,我希望从~4 yo膝上型HDD.

中获得。

那么h5py在哪里失去了它的速度呢?我想纯粹的读出应该只是硬盘的速度。因此,瓶颈是:

将it)?

  • Allocating地址解析到数据集(ROOT不需要在python?

  • Something

中执行HDF5内存)

如果有线索我会很感激的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-25 16:45:27

有许多HDF5 I/O问题需要考虑。我会尽力把每一件事都包括进去。

从我的测试来看,I/O所花费的时间主要取决于读/写的次数,而不是读/写的数据量(以MB计)。请阅读此文章以获取更多详细信息:pytables writes much faster than h5py. Why?注意:它显示了h5py和PyTables具有不同I/O写入大小的固定数量数据的I/O性能。基于此,大部分时间都花在最后一行中是有意义的--这就是您将数据从磁盘读取到内存的NumPy数组(v1, v2, v3, v4, v5, v6)的位置。

关于你的问题:

  1. 阅读d2['SimSignal_X'][0]d2['SimSignal_X'][:]没有区别是有原因的。两者都将整个数据集读入内存(所有~1000个数据集值)。如果只想读取数据的一个片段,则需要使用切片表示法。例如,d2['SimSignal_X'][0:100]只读取前100个值(假设d2['SimSignal_X']只有一个轴- shape=(1000,))。注意:读取片将减少所需内存,但不会提高I/O读取时间。(事实上,读取切片可能会增加读取时间。)
  2. I不熟悉CERN,因此不能评论h5py与ROOT的性能。如果您想使用Python,请考虑以下几点:
    • --您正在将HDF5数据读入内存(作为NumPy数组)。你没必要那么做。您可以创建h5py数据集对象,而不是创建数组。这减少了最初的I/O。然后使用对象“如果”它们是np.arrays。唯一的改变是最后一行代码--比如:v1, v2, v3, v4, v5, v6 = d2['SimSignal_X'], d2['SimSignal_Y'], d2['SimSignal_Z'], d2['SimEfield_X'], d2['SimEfield_Y'], d2['SimEfield_Z']。注意如何不使用片表示法( [:]).
    • I或[0]发现PyTables比h5py快。您的代码可以很容易地转换为使用PyTables.
    • HDF5读取,可以使用“分块”来提高I/O性能。你没有说你是否在用这个。这可能会有帮助(很难说,因为您的数据集不太大)。您必须在创建HDF5文件时定义它,因此在您的情况下可能没有用。
    • 也没有说明在写入数据时是否使用了压缩过滤器。这减少了磁盘上文件的大小,但有降低I/O性能(增加读取时间)的副作用。如果您不知道,请检查文件creation.

是否启用了压缩

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67253941

复制
相关文章

相似问题

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