Source code for pypet.utils.hdf5compression

"""Module to allow hdf5 compression via ptrepack directly within python scripts"""

__author__ = 'Robert Meyer'

import os
import subprocess

from pypet.trajectory import load_trajectory
from pypet import pypetconstants


[docs]def compact_hdf5_file(filename, name=None, index=None, keep_backup=True): """Can compress an HDF5 to reduce file size. The properties on how to compress the new file are taken from a given trajectory in the file. Simply calls ``ptrepack`` from the command line. (Se also https://pytables.github.io/usersguide/utilities.html#ptrepackdescr) Currently only supported under Linux, no guarantee for Windows usage. :param filename: Name of the file to compact :param name: The name of the trajectory from which the compression properties are taken :param index: Instead of a name you could also specify an index, i.e -1 for the last trajectory in the file. :param keep_backup: If a back up version of the original file should be kept. The backup file is named as the original but `_backup` is appended to the end. :return: The return/error code of ptrepack """ if name is None and index is None: index = -1 tmp_traj = load_trajectory(name, index, as_new=False, load_all=pypetconstants.LOAD_NOTHING, force=True, filename=filename) service = tmp_traj.v_storage_service complevel = service.complevel complib = service.complib shuffle = service.shuffle fletcher32 = service.fletcher32 name_wo_ext, ext = os.path.splitext(filename) tmp_filename = name_wo_ext + '_tmp' + ext abs_filename = os.path.abspath(filename) abs_tmp_filename = os.path.abspath(tmp_filename) command = ['ptrepack', '-v', '--complib', complib, '--complevel', str(complevel), '--shuffle', str(int(shuffle)), '--fletcher32', str(int(fletcher32)), abs_filename, abs_tmp_filename] str_command = ' '.join(command) print('Executing command `%s`' % str_command) retcode = subprocess.call(command) if retcode != 0: print('#### ERROR: Compacting `%s` failed with errorcode %s! ####' % (filename, str(retcode))) else: print('#### Compacting successful ####') print('Renaming files') if keep_backup: backup_file_name = name_wo_ext + '_backup' + ext os.rename(filename, backup_file_name) else: os.remove(filename) os.rename(tmp_filename, filename) print('### Compacting and Renaming finished ####') return retcode