NCSA

[ HDF5 Tutorial Top ]

Mounting Files


Contents:


Mounting Files

HDF5 allows you to combine two or more HDF5 files in a manner similar to mounting files in UNIX. The group structure and metadata from one file appear as though they exist in another file. The following steps are involved:
  1. Open the files.
  2. Choose the "mount point" in the first file (parent). The "mount point" in HDF5 is a group ( it can also be the root group ).
  3. Use the HDF5 API function H5Fmount to mount the second file (child) in the first one.
  4. Work with the objects in the second file as if they were members of the "mount point" group in the first file. The previous contents of the "mount point" group are temporarily hidden.
  5. Unmount the second file using the H5Funmount function when the work is done.

Programming Example

Description

In the following example we create one file with a group in it, and another file with a dataset. Mounting is used to access the dataset from the second file as a member of a group in the first file. The following picture illustrates this concept.

    'FILE1'                                 'FILE2'
  
--------------------                   --------------------
!                  !                   !                  !
!      /           !                   !       /          !
!       |          !                   !        |         !
!       |          !                   !        |         !
!       V          !                   !        V         !
!     --------     !                   !     ----------   !
!     ! Group !    !                   !     ! Dataset!   !
!     ---------    !                   !     ----------   !
!------------------!                   !------------------! 
After mounting the second file, 'FILE2', under the group in the file, 'FILE1', the parent has the following structure:
 
                                'FILE1'                                 
  
                           --------------------                   
                           !                  !                  
                           !      /           !               
                           !       |          !            
                           !       |          !         
                           !       V          !    
                           !     --------     !              
                           !     ! Group !    !            
                           !     ---------    !           
                           !         |        !
                           !         |        !
                           !         V        !
                           !    -----------   !
                           !    ! Dataset !   !
                           !    !----------   !
                           !                  !
                           !------------------!                    

[
Download h5_mount.c ]
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#include<hdf5.h>

#define FILE1 "mount1.h5"
#define FILE2 "mount2.h5"

#define RANK 2
#define NX 4
#define NY 5

int main(void) 
{

   hid_t fid1, fid2, gid;  /* Files and group identifiers */
   hid_t did, tid, sid;    /* Dataset and datatype identifiers */ 

   herr_t status;
   hsize_t dims[] = {NX,NY}; /* Dataset dimensions */

   int i, j;
   int bm[NX][NY], bm_out[NX][NY]; /* Data buffers */

   /*
    * Initialization of buffer matrix "bm" 
    */
   for(i =0; i < NX; i++) {
    for(j = 0; j < NY; j++)
      bm[i][j] = i + j;
   }

   /* 
    * Create first file and a group in it.
    */
   fid1 = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
   gid = H5Gcreate(fid1, "/G", 0);

   /* 
    * Close group and file 
    */
   H5Gclose(gid);
   H5Fclose(fid1);

   /* 
    * Create second file and dataset "D" in it.
    */
   fid2 = H5Fcreate(FILE2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
   dims[0] = NX;
   dims[1] = NY;
   sid = H5Screate_simple(RANK, dims, NULL);
   did = H5Dcreate(fid2, "D", H5T_NATIVE_INT, sid, H5P_DEFAULT);
  
   /*
    * Write data to the dataset.
    */
   status = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, bm);

   /* 
    * Close all identifiers.
    */
   H5Sclose(sid);
   H5Dclose(did);
   H5Fclose(fid2);

   /* 
    * Reopen both files
    */
   fid1 = H5Fopen(FILE1, H5F_ACC_RDONLY, H5P_DEFAULT);
   fid2 = H5Fopen(FILE2, H5F_ACC_RDONLY, H5P_DEFAULT);
  
   /* 
    * Mount second file under G in the first file.
    */
   H5Fmount(fid1, "/G", fid2, H5P_DEFAULT);

   /* 
    * Access dataset D in the first file under /G/D name.
    */
   did = H5Dopen(fid1,"/G/D");
   tid = H5Dget_type(did);
   status = H5Dread(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, bm_out);

   /*
    * Print out the data.
    */
   for(i=0; i < NX; i++){
    for(j=0; j < NY; j++)
        printf("  %d", bm_out[i][j]);
	printf("\n");
   }

   /* 
    * Close all identifers
    */
   H5Tclose(tid);
   H5Dclose(did);
	
   /* 
    * Unmounting second file
    */
   H5Funmount(fid1, "/G");

   /*
    * Close both files
    */
   H5Fclose(fid1);
   H5Fclose(fid2);

   return 0;
}
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Remarks


NCSA
The National Center for Supercomputing Applications

University of Illinois at Urbana-Champaign

hdfhelp@ncsa.uiuc.edu
Last Modified: August 27, 1999