5

我正在尝试增加 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)

知道为什么阅读有效,但设置无效吗?
关闭和重新打开文件似乎也无济于事。

4

3 回答 3

8

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


根据文档get_access_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)

上面创建了一个PropFAID。然后我们可以通过这种方式打开文件并获取FileID

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]

我们可以使用fid来打开具有高级接口的文件,方法是传递fidh5py.File

    f = h5py.File(fid)
    print(f.id.get_access_plist().get_cache())
    # (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)
于 2013-02-01T22:51:00.807 回答
7

从 h5py 版本 2.9.0 开始,现在可以直接通过主h5py.File界面使用此行为。控制“原始数据块缓存”的三个参数 — rdcc_nbytesrdcc_w0rdcc_nslots在此处记录。OP 试图调整rdcc_nbytes设置,现在可以简单地完成

import h5py

with h5py.File("test.h5", "w", rdcc_nbytes=5242880) as f:
    f.create_dataset(...)

在这种情况下,我假设您知道实际需要多少空间,而不是像 OP 想要的那样乘以 5。当前默认值与找到的 OP 相同。当然,如果您真的想以编程方式执行此操作,您可以只打开一次,获取缓存,关闭它,然后使用所需的参数重新打开。

于 2019-07-30T19:13:20.477 回答
1

h5py -cache项目可能会有所帮助,尽管我没有使用它:

import h5py_cache
with h5py_cache.File('test.h5', chunk_cache_mem_size=1024**3, 'a') as f:
    f.create_dataset(...)
于 2017-12-13T21:19:02.453 回答