¿Cómo establecer la configuración de la memoria caché utilizando la interfaz de alto nivel h5py?

Estoy intentando boost el tamaño del caché para mis archivos HDF5, pero no parece estar funcionando. Esto es lo que tengo:

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() 

Aquí está la salida:

 [0, 521, 1048576, 0.75] [0, 521, 5242880, 0.75] (0, 521, 1048576, 0.75) 

¿Alguna idea de por qué la lectura funciona, pero la configuración no?
El cierre y la reapertura del archivo tampoco parecen ayudar.

Según los documentos , get_access_plist() devuelve una copia de la lista de propiedades de acceso a archivos. Por lo tanto, no es sorprendente que la modificación de la copia no afecte al original.

Parece que la interfaz de alto nivel no proporciona una manera de cambiar la configuración de la caché.

Aquí es cómo podría hacerlo utilizando la interfaz de bajo nivel.

 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) 

Lo anterior crea un PropFAID . Entonces podemos abrir el archivo y obtener un FileID de esta manera:

 import contextlib with contextlib.closing(h5py.h5f.open( filename, flags=h5py.h5f.ACC_RDWR, fapl=propfaid)) as fid: #  settings = list(fid.get_access_plist().get_cache()) print(settings) # [0, 521, 5242880, 0.75] 

Y podemos usar el fid para abrir el archivo con la interfaz de alto nivel pasando fid a h5py.File :

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

Por lo tanto, aún puede utilizar la interfaz de alto nivel, pero se requieren algunos trucos para llegar allí. Por otro lado, si lo destila solo a lo esencial, quizás no sea tan malo:

 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) 

El proyecto h5py-cache podría ser útil, aunque no lo he usado:

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