{"id":23278483,"url":"https://github.com/hdfgroup/hdf5-iotest","last_synced_at":"2025-08-21T11:31:28.803Z","repository":{"id":44916855,"uuid":"281256033","full_name":"HDFGroup/hdf5-iotest","owner":"HDFGroup","description":"HDF5 Performance Analysis Checklist","archived":false,"fork":false,"pushed_at":"2024-12-23T23:27:45.000Z","size":1360,"stargazers_count":13,"open_issues_count":6,"forks_count":9,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-08-12T21:11:35.264Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/HDFGroup.png","metadata":{"files":{"readme":"README.org","changelog":null,"contributing":null,"funding":null,"license":"COPYING","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-07-21T00:33:26.000Z","updated_at":"2025-07-07T08:50:54.000Z","dependencies_parsed_at":"2024-12-19T22:31:57.293Z","dependency_job_id":"dc3f61f9-c8a5-4a16-a13d-99b06852ac41","html_url":"https://github.com/HDFGroup/hdf5-iotest","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/HDFGroup/hdf5-iotest","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HDFGroup%2Fhdf5-iotest","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HDFGroup%2Fhdf5-iotest/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HDFGroup%2Fhdf5-iotest/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HDFGroup%2Fhdf5-iotest/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/HDFGroup","download_url":"https://codeload.github.com/HDFGroup/hdf5-iotest/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HDFGroup%2Fhdf5-iotest/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":271470103,"owners_count":24765315,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-21T02:00:08.990Z","response_time":74,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-12-19T22:31:54.984Z","updated_at":"2025-08-21T11:31:28.227Z","avatar_url":"https://github.com/HDFGroup.png","language":"Jupyter Notebook","funding_links":[],"categories":[],"sub_categories":[],"readme":"#+TITLE:  HDF5 I/O Test\n#+AUTHOR: Gerd Heber\n#+EMAIL: gheber@hdfgroup.org\n#+DATE: [2020-12-30 Wed]\n\n#+PROPERTY: header-args :eval never-export\n\n* Description\n\nThis is a simple I/O performance tester for HDF5.  (See also [[https://github.com/ornladios/ADIOS2/tree/master/source/utils/adios_iotest][ADIOS IOTEST]].) Its\npurpose is to assess the /performance variability/ of a set of logically\nequivalent HDF5 representations of a common pattern. The test repeatedly writes\n(and reads) in parallel a set of 2D array variables in a tiled fashion, over a\nset of \"time steps.\" A schematic is shown below.\n\n#+begin_src plantuml :hidden :file ./img/flow.png :exports results\n\nstart\n\n:read configuration;\nrepeat\n  :set \u003ci\u003einternal\u003c/i\u003e parameters;\n  :create HDF5 file;\n  repeat\n    :[create group];\n    repeat\n      :[create dataset(s)];\n      fork\n        :write 2D tile 1;\n      fork again\n        :...;\n      fork again\n        :write 2D tile P;\n      end fork\n    repeat while (last 2D array?) is (no)\n    -\u003eyes;\n  repeat while (last time step?) is (no)\n  -\u003eyes;\n  :close file;\n  :...\n  read back the data\n  **details not shown**;\n  :report timings;\nrepeat while (last combination?) is (no)\n-\u003eyes;\n\nstop\n\n#+end_src\n\n#+RESULTS:\n[[file:./img/flow.png]]\n\nA configuration file (see below) is used to control parameters such as the\nnumber of steps, the count and shape of the 2D array variables, etc. (See\nsection [[sec:parameters]].) The test then uses between 48 and 192 different\ncombinations of up to 7 internal parameters (see section [[sec:internal-parameters]])\nto configure the HDF5 library and output, to perform write and read operations,\nand to report certain timings. (The number of combinations is different for\nsequential and parallel runs, and depends on other choices.)\n\nFor a /baseline/, this test can (and should!) be run with a single MPI process\nusing the POSIX, core, and MPI-IO VFDs. Typically, each baseline variant covers\na different aspect of the underlying system, its configuration, and the\nparticular HDF5 library version. Doing MPI-parallel runs without this baseline\nis the proverbial \"getting off on the wrong foot.\"\n\n* Installation\n\nWhile it can be built manually, we recommend building =hdf5_iotest= from [[https://computing.llnl.gov/projects/spack-hpc-package-manager][Spack]].\n\n1. Create a new Spack package\n   #+begin_src sh\n   spack create --name hdf5iotest\n   #+end_src\n   This creates a boilerplate =package.py= file, which we'll need to edit.\n2. Edit the freshly minted =package.py= via\n   #+begin_src sh\n   spack edit hdf5iotest\n   #+end_src\n   =package.py= should look like this:\n   #+begin_src python\n   # Copyright 2013-2020 Lawrence Livermore National Security, LLC and other\n   # Spack Project Developers. See the top-level COPYRIGHT file for details.\n   #\n   # SPDX-License-Identifier: (Apache-2.0 OR MIT)\n\n   from spack import *\n\n   class Hdf5iotest(AutotoolsPackage):\n       \"\"\"\n       A simple I/O performance test for HDF5.\n       Run with 'hdf5_iotest \u003cINI file\u003e'. A sample INI file called\n       hdf5_iotest.ini can be found in the share/hdf5-iotest subdirectory.\n       It is recommended to run multiple configurations. The combinator.sh\n       script in share/hdf5-iotest creates 24 \"standard\" parameter cominations.\n       \"\"\"\n\n       homepage = \"https://github.com/HDFGroup/hdf5-iotest\"\n       git      = \"https://github.com/HDFGroup/hdf5-iotest.git\"\n\n       maintainers = ['gheber']\n\n       version('master', branch='master')\n\n       depends_on('autoconf', type='build')\n       depends_on('automake', type='build')\n       depends_on('libtool',  type='build')\n       depends_on('m4',       type='build')\n       depends_on('mpi')\n       depends_on('hdf5')\n       depends_on('util-linux-uuid')\n\n       def configure_args(self):\n           args = []\n           if \"+gperftools\" not in self.spec:\n               args += [\"--enable-gperftools\"]\n\n           return args\n\n       def test(self):\n           pass\n   #+end_src\n3. Show the explicit dependency configuration (libraries, versions, compiler, architecture, etc. ) via\n   #+begin_src sh\n   spack spec hdf5iotest\n   #+end_src\n   Sample output can be found in the [[sec:spack-spec-out][appendix]].\n4. Install the hdf5iotest package and all dependencies\n   #+begin_src sh\n   spack install hdf5iotest\n   #+end_src\n\n** Installation w/o Spack\nYou need a working installation of parallel HDF5 (which depends on MPI).\n\n#+begin_src sh\n./autogen.sh\nCC=h5pcc ./configure --prefix=\u003cinstallation directory\u003e\nmake\nmake install\n#+end_src\n\n* Usage\n\n=hdf5_iotest= accepts a single argument, the name of a configuration file. If no\nconfiguration file name is provided, it looks for a configuration named\n=hdf5_iotest.ini= in the current working directory.\n\n#+begin_src sh\nhdf5_iotest [INI file]\n#+end_src\n\nThe configuration file syntax is shown [[sec:parameters][below]]:\n\n#+begin_src conf-unix :tangle src/hdf5_iotest.ini :noweb no-export\n[DEFAULT]\n\u003c\u003chdf5-iotest-conf\u003e\u003e\n#+end_src\n\nA complete configuration can be found [[https://raw.githubusercontent.com/HDFGroup/hdf5-iotest/master/src/hdf5_iotest.ini][here]].\n\n** Custom Settings\nRather than modifying the =[DEFAULT]= section, we recommend that testers create\na new section, e.g., =[CUSTOM]=, and overwrite the default values as needed.\n\n#+begin_example\n[DEFAULT]\n...\n\n[CUSTOM]\n...\n#+end_example\n\nAny parameter specified in the =[CUSTOM]= section overwrites its =[DEFAULT]=\ncounterpart.\n\n** Parameters\u003c\u003csec:parameters\u003e\u003e\nThe following configuration parameters are supported.\n\n- Version :: The HDF5 I/O test configuration version\n    #+begin_src conf-unix :noweb-ref hdf5-iotest-conf\n version = 0\n    #+end_src\n    Currently, 0 is the only valid version.\n\n- Steps :: The number of steps or repetitions, a positive integer.\n    #+begin_src conf-unix :noweb-ref hdf5-iotest-conf\n steps = 20\n    #+end_src\n\n- Number of 2D Array Variables :: The number of 2D array variables to be\n  written, a positive integer.\n    #+begin_src conf-unix :noweb-ref hdf5-iotest-conf\n arrays = 500\n    #+end_src\n\n- Array Rows :: HDF5 I/O test can be run in /strong/ or /weak/ scaling mode (see\n  [[sec:scaling][below]]). For /strong/ scaling, this is the total number (across all MPI ranks)\n  of rows of each 2D array variable. For /weak/ scaling, this is the number of\n  rows per MPI process per 2D array variable.\n    #+begin_src conf-unix :noweb-ref hdf5-iotest-conf\n rows = 100\n    #+end_src\n\n- Array Columns :: HDF5 I/O test can be run in /strong/ or /weak/ scaling mode\n  (see [[sec:scaling][below]]). For /strong/ scaling, this is the total number (across all MPI\n  ranks) of columns of each 2D array variable. For /weak/ scaling, this is the\n  number of columns per MPI process per 2D array variable.\n    #+begin_src conf-unix :noweb-ref hdf5-iotest-conf\n columns = 200\n    #+end_src\n\n- Number of MPI Process Rows :: HDF5 I/O test is run over a logical 2D grid\n     of MPI processes. This is the number of MPI process rows.\n    #+begin_src conf-unix :noweb-ref hdf5-iotest-conf\n process-rows = 1\n    #+end_src\n\n    For strong scaling, the =rows= must be divisible by =process-rows=.\n\n- Number of MPI Process Columns :: HDF5 I/O test is run over a logical 2D grid\n     of MPI processes. This is the number of MPI process columns.\n    #+begin_src conf-unix :noweb-ref hdf5-iotest-conf\n process-columns = 1\n    #+end_src\n\n    For strong scaling, the =columns= parameter must be divisible by\n  =process-columns=.\n\n- Scaling\u003c\u003csec:scaling\u003e\u003e :: HDF5 I/O test can be run with strong or weak\n  scaling. In /strong scaling/ mode, the total amount of data written and read\n  is independent of the number of MPI processes, i.e., the per process I/O share\n  diminishes with an increase in the number of I/O processes. In /weak scaling/\n  mode, the amount of data written and read by each MPI-process is kept\n  constant, and the total I/O increases with the number of MPI processes.\n    #+begin_src conf-unix :noweb-ref hdf5-iotest-conf\n    # [weak, strong]\n    scaling = weak\n    #+end_src\n\n- Alignment Increment :: Align HDF5 objects greater than or equal to an\n  alignment threshold on addresses which are a multiple of this increment.\n    #+begin_src conf-unix :noweb-ref hdf5-iotest-conf\n    # align along increment [bytes] boundaries\n    alignment-increment = 1\n    #+end_src\n\n  By default, there are no alignment restrictions in effect, and only\n  increments greater than 1 have any effect.\n\n- Alignment Threshold :: The minimum object size (in bytes) for which alignment\n  constraints will be enforced. A threshold of 0 forces everything to be\n  aligned.\n    #+begin_src conf-unix :noweb-ref hdf5-iotest-conf\n    # minimum object size [bytes] to force alignment (0=all objects)\n    alignment-threshold = 0\n    #+end_src\n\n- Meta Block Size :: The minimum size of metadata block allocations\n  when ~H5FD_FEAT_AGGREGATE_METADATA~ is set by a VFL driver.\n    #+begin_src conf-unix :noweb-ref hdf5-iotest-conf\n    # minimum metadata block allocation size in [bytes]\n    meta-block-size = 2048\n    #+end_src\n\n  Setting the value to 0 with this function will turn off metadata\n  aggregation, even if the VFL driver attempts to use the metadata\n  aggregation strategy.\n\n  The POSIX, core, and MPI-IO VFDs all support metadata allocation\n  aggregation.\n\n- Single Process I/O :: The I/O driver or mode to be used when running with a\n  single process.\n    #+begin_src conf-unix :noweb-ref hdf5-iotest-conf\n    # [posix, core, mpi-io-uni]\n    single-process = posix\n    #+end_src\n\n    This setting is important when establishing a single-process\n  /baseline/. =posix= uses the default POSIX VFD. =core= uses a memory-backed\n  HDF5 file where the underlying memory buffer grows in 64 MB\n  increments. =mpi-io-uni= uses the MPI-IO VFD (with a single process).\n\n- HDF5 Output File Name :: The default HDF5 output file name is\n     =hdf5_iotest.h5=. Use this parameter to select a different name.\n     *Note*: The character \"#\" in the filename is reserved for creating an HDF5 \n     with the \"#\" replaced with the accumulated case number, for example *hdf5_iotest.#.h5*.\n    #+begin_src conf-unix :noweb-ref hdf5-iotest-conf\n    hdf5-file = hdf5_iotest.h5\n    #+end_src\n\n- Results File :: When running the HDF5 I/O test, certain metrics are printed to\n                  =stdout=. To simplify the analysis of results from multiple\n                  runs, they are also written to a CSV file whose name is\n                  configurable.\n    #+begin_src conf-unix :noweb-ref hdf5-iotest-conf\n csv-file = hdf5_iotest.csv\n    #+end_src\n\n- Restart :: The simulations will resume from (and including) the last successful\n             entry in the result's CSV file. A value of 1 indicates a restart run,\n             and 0 is no restart. If the keyword is not present, the default is \n             not a restart.\n    #+begin_src conf-unix :noweb-ref hdf5-iotest-conf\n    # [0, 1]\n    restart = 1\n    #+end_src\n\n- Split :: The split I/O driver will be used [1]. Zero indicates to not use\n    the split file diriver, default.\n    #+begin_src conf-unix :noweb-ref hdf5-iotest-conf\n    # [0, 1]\n    split = 1\n    #+end_src\n\n- One-case :: The simulation will run only one case in the parameter space.\n    A value not equal to 0 indicates which parameter case to run, and the\n    value is a cumulative counter of the nested loops over the parameter space.\n    For example, to rerun the 100th case in the CSV file, the value would be 100.\n    If the keyword is not present, the default is to do all the cases.\n\n    #+begin_src conf-unix :noweb-ref hdf5-iotest-conf\n    # case number in the parameter space to run.\n    one-case = 100\n    #+end_src\n\n- Compression ::  Specifies the compression filter for chunked datasets and\n    currently supports /gzip/ and /szip/. The value corresponds to\n    parameters in the corresponding HDF5 API. Valid parameters for \"/gzip/\" is an\n    integer for the /level/ (see H5Pset_deflate). For \"/szip/\" value is\n    /options_mask/, and /pixels_per_block/ (see H5Pset_szip).\n\n    #+begin_src conf-unix :noweb-ref hdf5-iotest-conf\n    # compression filter (gzip, szip).\n    szip = H5_SZIP_NN_OPTION_MASK, 8\n    #+end_src\n\n- Async :: Specifies calling the async APIs (requires HDF5 version \u003e 1.12) and\n    [[https://github.com/hpc-io/vol-async][ASYNC VOL]]\n\n    #+begin_src conf-unix :noweb-ref hdf5-iotest-conf\n    # enable async [0 - no, 1 - yes]\n    async = 1\n    #+end_src\n\n- Delay :: Add a delay between time steps. Helpful in simulating a computing phase\n    when doing async I/O.\n\n    #+begin_src conf-unix :noweb-ref hdf5-iotest-conf\n    # delay in the form of an integer and time unit second 's 'or milliseconds 'ms'\n    delay = 1s\n    #+end_src\n\n* Internal Parameters\u003c\u003csec:internal-parameters\u003e\u003e\n\nCurrently, the I/O test varies the following parameters:\n\n- Dataset Rank :: The 2D array variables can be stored individually, or embedded\n  into 3D or 4D datasets. In other words, the rank can be 2, 3, or 4.\n- Slowest Dimension :: The slowest dimension can be array (count) or time.\n- Initialization with Fill Values :: The default behavior of the HDF5 library is\n  to initialize storage with the default or a user-specified fill value. This\n  incurs additional I/O and may reduce performance.\n- Storage Layout :: The dataset storage layout in the HDF5 file can be chunked\n  or contiguous (or compact or virtual or user-defined).\n- Alignment :: HDF5 objects greater than or equal to an alignment threshold can\n  be aligned on addresses that are a multiple of a certain increment.\n- Lower Library Version Bound  :: The HDF5 library can be configured to use the\n  earliest or latest available file format micro-versions when generating\n  objects.\n- MPI I/O Operations :: With MPI, the write and read operations can be collective\n  or independent.\n\nSince there is no shortage of knobs in the HDF5 API, other parameters might be\nadded in the future.\n\n* Appendix \u003c\u003csec:appendix\u003e\u003e\n** Sample =spack spec hdf5iotest= output \u003c\u003csec:spack-spec-out\u003e\u003e\n#+begin_example\n==\u003e Using specified package name: 'hdf5iotest'\n==\u003e Created template for hdf5iotest package\n==\u003e Created package file: /home/gerdheber/GitHub/spack/var/spack/repos/builtin/packages/hdf5iotest/package.py\nWaiting for Emacs...\n% spack spec hdf5iotest\nInput spec\n--------------------------------\nhdf5iotest\n\nConcretized\n--------------------------------\nhdf5iotest@spack%gcc@8.3.0 arch=linux-debian10-skylake\n ^autoconf@2.69%gcc@8.3.0 arch=linux-debian10-skylake\n     ^m4@1.4.18%gcc@8.3.0+sigsegv patches=3877ab548f88597ab2327a2230ee048d2d07ace1062efe81fc92e91b7f39cd00,fc9b61654a3ba1a8d6cd78ce087e7c96366c290bc8d2c299f09828d793b853c8 arch=linux-debian10-skylake\n         ^libsigsegv@2.12%gcc@8.3.0 arch=linux-debian10-skylake\n     ^perl@5.32.0%gcc@8.3.0+cpanm+shared+threads arch=linux-debian10-skylake\n         ^berkeley-db@18.1.40%gcc@8.3.0 arch=linux-debian10-skylake\n         ^gdbm@1.18.1%gcc@8.3.0 arch=linux-debian10-skylake\n             ^readline@8.0%gcc@8.3.0 arch=linux-debian10-skylake\n                 ^ncurses@6.2%gcc@8.3.0~symlinks+termlib arch=linux-debian10-skylake\n                     ^pkgconf@1.7.3%gcc@8.3.0 arch=linux-debian10-skylake\n ^automake@1.16.3%gcc@8.3.0 arch=linux-debian10-skylake\n ^hdf5@1.10.7%gcc@8.3.0~cxx~debug~fortran~hl~java+mpi+pic+shared~szip~threadsafe api=none arch=linux-debian10-skylake\n     ^openmpi@4.0.5%gcc@8.3.0~atomics~cuda~cxx~cxx_exceptions+gpfs~java~legacylaunchers~lustre~memchecker~pmi~singularity~sqlite3+static~thread_multiple+vt+wrapper-rpath fabrics=none schedulers=none arch=linux-debian10-skylake\n         ^hwloc@2.2.0%gcc@8.3.0~cairo~cuda~gl~libudev+libxml2~netloc~nvml+pci+shared arch=linux-debian10-skylake\n             ^libpciaccess@0.16%gcc@8.3.0 arch=linux-debian10-skylake\n                 ^libtool@2.4.6%gcc@8.3.0 arch=linux-debian10-skylake\n                 ^util-macros@1.19.1%gcc@8.3.0 arch=linux-debian10-skylake\n             ^libxml2@2.9.10%gcc@8.3.0~python arch=linux-debian10-skylake\n                 ^libiconv@1.16%gcc@8.3.0 arch=linux-debian10-skylake\n                 ^xz@5.2.5%gcc@8.3.0~pic arch=linux-debian10-skylake\n                 ^zlib@1.2.11%gcc@8.3.0+optimize+pic+shared arch=linux-debian10-skylake\n         ^numactl@2.0.14%gcc@8.3.0 patches=4e1d78cbbb85de625bad28705e748856033eaafab92a66dffd383a3d7e00cc94 arch=linux-debian10-skylake\n#+end_example\n** Sample CSV Output\nThe CSV output looks like this. It's then easy to concatenate several of these\n(after stripping out the header), and load them into [[https://pandas.pydata.org/][pandas]] or [[https://www.r-project.org/][R]].\n\n#+begin_example\nsteps,arrays,rows,cols,scaling,proc-rows,proc-cols,slowdim,rank,version,alignment-increment,alignment-threshold,layout,fill,fmt,io,wall [s],fsize [B],write-phase-min [s],write-phase-max [s],creat-min [s],creat-max [s],write-min [s],write-max [s],read-phase-min [s],read-phase-max [s],read-min [s],read-max [s]\n20,500,100,200,weak,1,1,step,2,\"1.8.22\",1,0,contiguous,true,earliest,core,15.37,1689710848,14.10,14.10,7.25,7.25,0.77,0.77,1.27,1.27,0.27,0.27\n20,500,100,200,weak,1,1,step,2,\"1.8.22\",1,0,contiguous,true,latest,core,20.70,1682116757,19.53,19.53,12.08,12.08,0.78,0.78,1.17,1.17,0.28,0.28\n...\n#+end_example\n\n*** Metrics\nAll timings are obtained via =MPI_Wtime=. For some metrics, we record minima and\nmaxima across MPI ranks. The columns =steps= through =mpi-io= are just\nreiterations of the configuration parameters. The remaining columns are as\nfollows:\n\n- =wall [s]= :: Wall time in seconds.\n- =fsize [B]= :: The HDF5 output file size in bytes\n- =write-phase-min [s],write-phase-max [s]= :: The fastest and slowest\n  cumulative write phase time in seconds. This includes the time for file and\n  dataset creation(s).\n- =creat-min [s],creat-max [s]= :: The fastest and slowest time spent in\n  =H5Fcreate=, =H5Fclose=, and =H5Dcreate= in seconds\n- =write-min [s],write-max [s]= :: The fastest and slowest cumulative =H5Dwrite=\n  time in seconds\n- =read-phase-min [s],read-phase-max [s]= :: The fastest and slowest cumulative\n  read phase time in seconds. This includes the times for opening and closing\n  the HDF5 file and for creating dataset selections.\n- =read-min [s],read-max [s]= :: The fastest and slowest cumulative =H5Dread=\n  time in seconds\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhdfgroup%2Fhdf5-iotest","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhdfgroup%2Fhdf5-iotest","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhdfgroup%2Fhdf5-iotest/lists"}