#include "H5Cpp.h"
#include <HDF5Utils/DefaultMerger.h>
#include <boost/program_options.hpp>
#include <boost/algorithm/string/split.hpp>
#include <boost/algorithm/string/trim.hpp>
#include <iostream>
#include <iomanip>
Go to the source code of this file.
|
int | main (int argc, char *argv[]) |
| A simple script to merge HDF5 files. More...
|
|
◆ main()
int main |
( |
int |
argc, |
|
|
char * |
argv[] |
|
) |
| |
A simple script to merge HDF5 files.
This script is intended to read in a list of HDF5 files and create a new file with all datasets contained inside them concatenated along a particular axis.
Definition at line 22 of file hdf5-merge.cxx.
25 std::string inCSV =
"";
27 hsize_t mergeAxis = 0;
29 bool requireSameFormat =
true;
30 std::size_t bufferSizeMB = 100;
31 std::size_t bufferSizeRows = -1;
32 bool overwrite =
false;
35 namespace po = boost::program_options;
36 po::options_description
desc(
"Allowed options");
39 (
"input,i",
po::value(&inCSV),
"A comma separated list of input files")
40 (
"allowDifferentFormats", po::bool_switch(&requireSameFormat),
41 "Allow input files to have different formats.")
43 "The axis along which to merge datasets")
45 "The chunk size to use along the merge axis. If left negative uses the same chunks as the first input.")
46 (
"bufferSizeMB,B",
po::value(&bufferSizeMB),
47 "The size of the buffer to use in MB. Cannot be set with 'bufferSizeRows'")
48 (
"bufferSizeRows,b",
po::value(&bufferSizeRows),
49 "The size of the buffer to use in rows. Cannot be set with 'bufferSizeMB'")
50 (
"overwrite,w", po::bool_switch(&overwrite),
51 "Overwrite the output file if it already exists. Cannot be set with 'in-place'")
52 (
"in-place,p", po::bool_switch(&inPlace),
53 "The output file is modified in place. Cannot be set with 'overwrite'")
54 (
"help,h",
"Print this message and exit.");
56 po::options_description hidden;
59 po::positional_options_description positional;
60 positional.add(
"inputFiles", -1);
63 po::options_description allOptions;
64 allOptions.add(
desc).add(hidden);
69 positional(positional).
74 if (vm.count(
"help") ) {
75 std::cout <<
"Merge HDF5 files. Usage:" << std::endl << std::endl;
76 std::cout <<
"hdf5-merge [options] [--input input1,input2,... | input1 [input2 ...]]" << std::endl << std::endl;
77 std::cout <<
desc << std::endl;
82 if (inCSV.size() > 0) {
83 std::vector<std::string> splitCSV;
85 for (
const std::string&
i : splitCSV)
86 inputFiles.push_back(boost::algorithm::trim_copy(
i) );
89 std::cerr <<
"You must specify at least 1 input file!" << std::endl;
92 if (overwrite && inPlace) {
93 std::cerr <<
"You cannot specify both overwrite and in-place!" << std::endl;
96 if (vm.count(
"bufferSizeMB") && vm.count(
"bufferSizeRows") ) {
97 std::cerr <<
"You cannot specify both bufferSizeMB and bufferSizeRows!" << std::endl;
102 if (vm.count(
"bufferSizeRows") ) {
108 std::size_t MB = 1024*1024;
109 if (std::size_t(-1) / bufferSizeMB < MB)
110 throw std::overflow_error(
111 "Requested buffer size would overflow the register!");
112 buffer = bufferSizeMB * MB;
113 bufferInRows =
false;
122 overwrite ? H5F_ACC_TRUNC : (inPlace ? H5F_ACC_RDWR : H5F_ACC_EXCL) );
124 for (
const std::string& inName :
inputFiles) {
125 std::cout <<
"Merging file " << inName << std::endl;
126 H5::H5File
fIn(inName, H5F_ACC_RDONLY);