In-memory HDF5 files¶
The HDF5 library provides functions to allow an application to work with a file in memory for faster reads and writes. File contents are kept in memory until the file is closed. At closing, the memory version of the file can be written back to disk or abandoned.
Open an existing file in memory¶
Assuming the sample.h5
exists in the current folder, it is possible to
open it in memory simply using the CORE driver at opening time.
The HDF5 driver that one intend to use to open/create a file can be specified
using the driver keyword argument of the tables.open_file()
function:
>>> import tables
>>> h5file = tables.open_file("sample.h", driver="H5FD_CORE")
The content of the :file`sample.h5` is opened for reading. It is loaded into memory and all reading operations are performed without disk I/O overhead.
Note
the initial loading of the entire file into memory can be time expensive depending on the size of the opened file and on the performances of the disk subsystem.
See also
general information about HDF5 drivers can be found in the Alternate File Storage Layouts and Low-level File Drivers [3] section of the HDF5 User’s Guide [1].
Creating a new file in memory¶
Creating a new file in memory is as simple as creating a regular file, just one needs to specify to use the CORE driver:
>>> import tables
>>> h5file = tables.open_file("new_sample.h5", "w", driver="H5FD_CORE")
>>> import numpy
>>> a = h5file.create_array(h5file.root, "array", numpy.zeros((300, 300)))
>>> h5file.close()
Backing store¶
In the previous example contents of the in-memory h5file are automatically
saved to disk when the file descriptor is closed, so a new
new_sample.h5
file is created and all data are transferred to disk.
Again this can be time a time expensive action depending on the amount of data in the HDF5 file and depending on how fast is the disk I/O.
Saving data to disk is the default behavior for the CORE driver in PyTables.
This feature can be controlled using the driver_core_backing_store
parameter of the tables.open_file()
function. Setting it to False
disables the backing store feature and all changes in the working h5file
are lost after closing:
>>> h5file = tables.open_file("new_sample.h5", "w", driver="H5FD_CORE",
... driver_core_backing_store=0)
Please note that the driver_core_backing_store disables saving of data, not
loading.
In the following example the sample.h5
file is opened in-memory in
append mode. All data in the existing sample.h5
file are loaded into
memory and contents can be actually modified by the user:
>>> import tables
>>> h5file = tables.open_file("sample.h5", "a", driver="H5FD_CORE",
driver_core_backing_store=0)
>>> import numpy
>>> h5file.create_array(h5file.root, "new_array", numpy.arange(20),
title="New array")
>>> array2 = h5file.root.array2
>>> print(array2)
/array2 (Array(20,)) 'New array'
>>> h5file.close()
Modifications are lost when the h5file descriptor is closed.
Memory images of HDF5 files¶
It is possible to get a memory image of an HDF5 file (see HDF5 File Image Operations [2]). This feature is only available if PyTables is build against version 1.8.9 or newer of the HDF5 library.
In particular getting a memory image of an HDF5 file is possible only if the file has been opened with one of the following drivers: SEC2 (the default one), STDIO or CORE.
An example of how to get an image:
>>> import tables
>>> h5file = tables.open_file("sample.h5")
>>> image = h5file.get_file_image()
>>> h5file.close()
The memory ìmage of the sample.h5
file is copied into the ìmage
string (of bytes).
Note
the ìmage string contains all data stored in the HDF5 file so, of course, it can be quite large.
The ìmage string can be passed around and can also be used to initialize a new HDF55 file descriptor:
>>> import tables
>>> h5file = tables.open_file("in-memory-sample.h5", driver="H5DF_CORE",
driver_core_backing_store=0)
>>> print(h5file.root.array)
/array (Array(300, 300)) 'Array'
>>> h5file.setNodeAttr(h5file.root, "description", "In memory file example")
[1] | http://www.hdfgroup.org/HDF5/doc/UG/index.html |
[2] | http://www.hdfgroup.org/HDF5/doc/Advanced/FileImageOperations/HDF5FileImageOperations.pdf |
[3] | http://www.hdfgroup.org/HDF5/doc/UG/08_TheFile.html#Drivers |