How to set cache settings while using h5py high level interface?

h5py, python

Solution

If you are using h5py version 2.9.0 or newer, see Mike's answer.

According to the docs, `get_access_plist()` returns a copy of the file access property list. So it is not surprising that modifying the copy does not affect the original.

It appears the high-level interface does not provide a way to change the cache settings.

Here is how you could do it using the low-level interface.

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)

The above creates a PropFAID. We can then open the file and get a FileID this way:

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]

And we can use the `fid` to open the file with the high-level interface by passing `fid` to `h5py.File`:

    f = h5py.File(fid)
    print(f.id.get_access_plist().get_cache())
    # (0, 521, 5242880, 0.75)

Thus, you can still use the high-level interface, but it takes some fiddling to get there. On the other hand, if you distill it to just the essentials, perhaps it isn't so bad:

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)

Problem

I'm trying to increase cache size for my HDF5 files, but it doesn't seem to be working. This is what I have: ``` 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() ``` Here is the output: ``` [0, 521, 1048576, 0.75] [0, 521, 5242880, 0.75] (0, 521, 1048576, 0.75) ``` Any idea why reading works, but setting doesn't? Closing and reopening the file doesn't seem to help either.

Original source