Python 如何在使用h5py高级接口时设置缓存设置?

Python 如何在使用h5py高级接口时设置缓存设置?,python,h5py,Python,H5py,我正在尝试增加HDF5文件的缓存大小,但它似乎不起作用。 这就是我所拥有的: import h5py with h5py.File("test.h5", 'w') as fid: # cache settings of file cacheSettings = list(fid.id.get_access_plist().get_cache()) print cacheSettings # increase cache

我正在尝试增加HDF5文件的缓存大小,但它似乎不起作用。 这就是我所拥有的:

import h5py

with h5py.File("test.h5", 'w') as fid:
        # cache settings of file
        cacheSettings = list(fid.id.get_access_plist().get_cache())
        print cacheSettings
        # increase cache
        cacheSettings[2] = int(5 * cacheSettings[2])
        print cacheSettings
        # read cache settings from file
        fid.id.get_access_plist().set_cache(*cacheSettings)
        print fid.id.get_access_plist().get_cache()
以下是输出:

[0, 521, 1048576, 0.75]
[0, 521, 5242880, 0.75]
(0, 521, 1048576, 0.75)
知道为什么阅读有效,但设置无效吗?

关闭并重新打开文件似乎也没有帮助。

如果您使用的是h5py 2.9.0版或更高版本,请参阅


根据,
get\u access\u plist()
返回文件访问属性列表的副本。因此,修改副本不会影响原件也就不足为奇了

高级接口似乎不提供更改缓存设置的方法

下面是如何使用低级接口来完成此操作

propfaid = h5py.h5p.create(h5py.h5p.FILE_ACCESS)
settings = list(propfaid.get_cache())
print(settings)
# [0, 521, 1048576, 0.75]

settings[2] *= 5
propfaid.set_cache(*settings)
settings = propfaid.get_cache()
print(settings)
# (0, 521, 5242880, 0.75)
以上内容创建了一个新的应用程序。然后,我们可以通过以下方式打开该文件并获取一个:

import contextlib
with contextlib.closing(h5py.h5f.open(
                        filename, flags=h5py.h5f.ACC_RDWR, fapl=propfaid)) as fid:
    # <h5py.h5f.FileID object at 0x9abc694>
    settings = list(fid.get_access_plist().get_cache())
    print(settings)
    # [0, 521, 5242880, 0.75]
因此,您仍然可以使用高级接口,但需要一些时间 摆弄着去那里。另一方面,如果你把它提炼成基本的东西,也许就没那么糟糕了:

import h5py
import contextlib

filename = '/tmp/foo.hdf5'
propfaid = h5py.h5p.create(h5py.h5p.FILE_ACCESS)
settings = list(propfaid.get_cache())
settings[2] *= 5
propfaid.set_cache(*settings)
with contextlib.closing(h5py.h5f.open(filename, fapl=propfaid)) as fid:
    f = h5py.File(fid)
该项目可能会有所帮助,尽管我没有使用过:

import h5py_cache
with h5py_cache.File('test.h5', chunk_cache_mem_size=1024**3, 'a') as f:
    f.create_dataset(...)

从h5py版本2.9.0开始,此行为现在可以直接通过主
h5py.File
界面获得。有三个参数控制“原始数据块缓存”-
rdcc_nbytes
rdcc_w0
,以及
rdcc_nslots
,这些参数都有文档记录。OP试图调整
rdccnbytes
设置,现在只需按如下步骤即可

导入h5py
将h5py.File(“test.h5”,“w”,rdcc_nbytes=5242880)作为f:
f、 创建_数据集(…)

在本例中,我假设您知道实际需要多少空间,而不是按OP的要求乘以5。当前默认值与找到的OP相同。当然,如果你真的想通过编程来实现这一点,你可以只打开它一次,获取缓存,关闭它,然后用所需的参数重新打开。

那么在这行之后:
f=h5py.File(fid)
我可以用高级API来创建数据集吗?:
dset=f.create_数据集(“zipped_max”,(100100),压缩=“gzip”,压缩(可选=9)
是的;这就是对象的美妙之处。一旦你拥有了对象,它就拥有了该类的所有方法,无论对象是如何创建的。太棒了!我一直在使用高级API,但我刚刚意识到我需要后退一步,通过低级API来增加缓存大小。谢谢你的回复。我在制作sur时遇到了问题e文件已关闭。我发布了一个相关问题:请注意,自h5py版本2.9.0以来,可以通过
h5py.file
的参数直接操作缓存参数。此答案(+1)实际上是我以前用h5py编写代码的地方,但用户不再需要这样做。请参阅我的答案。请注意,此模块已合并到
h5py
本身,因此
h5py\u缓存
项目[我是其作者]现在已被弃用。有关如何使用此功能,请参阅我的答案。
import h5py_cache
with h5py_cache.File('test.h5', chunk_cache_mem_size=1024**3, 'a') as f:
    f.create_dataset(...)