{"id":1239,"date":"2026-08-21T14:28:36","date_gmt":"2026-08-21T14:28:36","guid":{"rendered":"https:\/\/matforge.org\/?p=1239","raw":"https:\/\/matforge.org\/?p=1239"},"modified":"2026-08-21T14:28:36","modified_gmt":"2026-08-21T14:28:36","slug":"hdf5-for-simulation-data-parallel-io-long-term-storage","status":"publish","type":"post","link":"https:\/\/matforge.org\/fr\/hdf5-for-simulation-data-parallel-io-long-term-storage\/","title":{"rendered":"HDF5 pour les donn\u00e9es de simulation : E\/S parall\u00e8les et stockage \u00e0 long terme","raw":"HDF5 pour les donn\u00e9es de simulation : E\/S parall\u00e8les et stockage \u00e0 long terme"},"content":{"rendered":"<span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\"> 12<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span><p>HDF5 est la norme de facto pour le stockage de donn\u00e9es de simulation scientifique \u00e0 grande \u00e9chelle. Sa structure hi\u00e9rarchique, ses capacit\u00e9s d&rsquo;E\/S parall\u00e8les via MPI et sa compression int\u00e9gr\u00e9e le rendent id\u00e9al pour les environnements de calcul haute performance. Cependant, une utilisation inappropri\u00e9e, en particulier de mauvais choix et des mod\u00e8les d&rsquo;acc\u00e8s parall\u00e8les incorrects, peut entra\u00eener une grave d\u00e9gradation des performances ou une corruption des donn\u00e9es. Ce guide couvre l&rsquo;architecture HDF5, la mise en \u0153uvre d&rsquo;E\/S parall\u00e8les en Python, les techniques d&rsquo;optimisation des performances et les meilleures pratiques de conservation pour le stockage \u00e0 long terme.<\/p>\n<h2>Introduction : Le d\u00e9fi des donn\u00e9es de simulation<\/h2>\n<p>Les simulations scientifiques g\u00e9n\u00e8rent r\u00e9guli\u00e8rement des t\u00e9raoctets de donn\u00e9es sur des milliers de pas de temps et plusieurs champs physiques. La gestion de ce d\u00e9luge n\u00e9cessite plus qu&rsquo;un simple format de fichier. Cela exige un syst\u00e8me capable de g\u00e9rer :<\/p>\n<ul>\n<li><strong>\u00c9chelle<\/strong>&nbsp;: gigaoctets en p\u00e9taoctets de tableaux multidimensionnels<\/li>\n<li><strong>performance<\/strong>&nbsp;: lecture\/\u00e9criture efficaces sur les syst\u00e8mes HPC avec des syst\u00e8mes de fichiers parall\u00e8les<\/li>\n<li><strong>Organisation<\/strong>&nbsp;: des structures auto-d\u00e9crivantes qui restent compr\u00e9hensibles des ann\u00e9es plus tard<\/li>\n<li><strong>Durabilit\u00e9<\/strong> : conservation \u00e0 long terme sans obsolescence de format<\/li>\n<li><strong>Access<\/strong>&nbsp;: sous-r\u00e9glage rapide sans lecture de jeux de donn\u00e9es entiers<\/li>\n<\/ul>\n<p>HDF5 (format de donn\u00e9es hi\u00e9rarchique version 5) r\u00e9pond \u00e0 ces d\u00e9fis gr\u00e2ce \u00e0 une combinaison de mod\u00e9lisation de donn\u00e9es flexible, de prise en charge d&rsquo;E\/S parall\u00e8les et d&rsquo;int\u00e9gration de m\u00e9tadonn\u00e9es. Largement adopt\u00e9 par la NASA, la NOAA, les laboratoires du DOE et les institutions de recherche, HDF5 est devenu l&rsquo;\u00e9pine dorsale des archives de donn\u00e9es scientifiques dans le monde[^1][^2].<\/p>\n<h2>Qu&rsquo;est-ce que le HDF5&nbsp;? Architecture et concepts de base<\/h2>\n<p>HDF5 est \u00e0 la fois un <strong>format de fichier<\/strong> et une <strong>biblioth\u00e8que logicielle<\/strong> qui fournit un conteneur pour des donn\u00e9es scientifiques h\u00e9t\u00e9rog\u00e8nes. Son architecture repose sur six entit\u00e9s fondamentales[^3]&nbsp;:<\/p>\n<ol>\n<li><strong>groupe<\/strong>&nbsp;: objets de conteneur analogues aux r\u00e9pertoires, organisation des donn\u00e9es hi\u00e9rarchique<\/li>\n<li><strong>Dataset<\/strong>&nbsp;: tableaux multidimensionnels contenant des donn\u00e9es num\u00e9riques ou structur\u00e9es r\u00e9elles<\/li>\n<li><strong>espace de donn\u00e9es<\/strong>&nbsp;: d\u00e9crit les dimensions de l&rsquo;ensemble de donn\u00e9es (forme, rang et \u00e9tendue)<\/li>\n<li><strong>Type de donn\u00e9es<\/strong>&nbsp;: sp\u00e9cifie les types d&rsquo;\u00e9l\u00e9ments (entiers, flotteurs, cha\u00eenes, compos\u00e9s)<\/li>\n<li><strong>Attribut<\/strong>&nbsp;: petites m\u00e9tadonn\u00e9es attach\u00e9es \u00e0 des groupes ou \u00e0 des ensembles de donn\u00e9es<\/li>\n<li><strong>Link<\/strong>&nbsp;: connecte les objets dans la hi\u00e9rarchie (liens rigides et logiciels)<\/li>\n<\/ol>\n<h3>La structure hi\u00e9rarchique<\/h3>\n<p>Un fichier HDF5 est un graphe dirig\u00e9 avec un seul groupe racine (<code>\/<\/code>). Les groupes peuvent contenir d&rsquo;autres groupes et ensembles de donn\u00e9es, permettant une imbrication arbitrairement profonde. Cette structure refl\u00e8te un syst\u00e8me de fichiers mais avec des diff\u00e9rences cl\u00e9s :<\/p>\n<ul>\n<li><strong>Auto-descriptif<\/strong>&nbsp;: toutes les m\u00e9tadonn\u00e9es (types de donn\u00e9es, dimensions) se d\u00e9placent avec les donn\u00e9es<\/li>\n<li><strong>Portable<\/strong>&nbsp;: format binaire ind\u00e9pendant de la plate-forme<\/li>\n<li><strong>Extensible<\/strong>&nbsp;: les ensembles de donn\u00e9es peuvent \u00eatre redimensionn\u00e9s et les groupes\/ensembles de donn\u00e9es ajout\u00e9s dynamiquement<\/li>\n<li><strong>Compress\u00e9<\/strong>&nbsp;: le stockage bas\u00e9 sur des blocs permet des filtres de compression par bloc<\/li>\n<\/ul>\n<pre><code>\/simulation\n\u251c\u2500\u2500 metadata\n\u2502   \u251c\u2500\u2500 title (attribute)\n\u2502   \u251c\u2500\u2500 creation_date (attribute)\n\u2502   \u2514\u2500\u2500 parameters (group)\n\u2502       \u251c\u2500\u2500 mesh_size (dataset)\n\u2502       \u2514\u2500\u2500 time_step (dataset)\n\u251c\u2500\u2500 fields\n\u2502   \u251c\u2500\u2500 temperature (dataset, 3D [x,y,z,time])\n\u2502   \u251c\u2500\u2500 velocity (dataset, 4D [x,y,z,time,component])\n\u2502   \u2514\u2500\u2500 pressure (dataset, 3D)\n\u2514\u2500\u2500 output\n    \u251c\u2500\u2500 checkpoint_001.h5 (external link)\n    \u2514\u2500\u2500 checkpoint_002.h5 (external link)\n<\/code><\/pre>\n<h2>Pourquoi HDF5 pour la simulation scientifique ?<\/h2>\n<p>Par rapport aux formats de texte brut (CSV, JSON) ou aux formats binaires plus simples, HDF5 offre des avantages critiques :<\/p>\n<ul>\n<li><strong>E\/S partielle<\/strong>&nbsp;: lecture uniquement des sous-ensembles n\u00e9cessaires sans charger des ensembles de donn\u00e9es entiers<\/li>\n<li><strong>Compression<\/strong>&nbsp;: la compression sans perte (GZIP, SZIP, LZF) r\u00e9duit le stockage de 2 \u00e0 10&nbsp;\u00d7<\/li>\n<li><strong>Acc\u00e8s parall\u00e8le<\/strong>&nbsp;: plusieurs processus peuvent lire\/\u00e9crire simultan\u00e9ment via MPI-IO<\/li>\n<li><strong>Riche des m\u00e9tadonn\u00e9es<\/strong>&nbsp;: attributs des unit\u00e9s de document, des descriptions et de la provenance<\/li>\n<li><strong>Prise en charge des fichiers volumineux<\/strong>&nbsp;: g\u00e8re les fichiers d\u00e9passant 2&nbsp;Go (contrairement \u00e0 l&rsquo;ancien HDF4)<\/li>\n<li><strong>Plateforme crois\u00e9e<\/strong>&nbsp;: fonctionne sous Linux, macOS, Windows&nbsp;; Prise en charge de Python, C, C++, Fortran, Matlab, R<\/li>\n<\/ul>\n<p>Pour les workflows de simulation, o\u00f9 les fichiers de point de contr\u00f4le, les sorties de s\u00e9ries chronologiques et les donn\u00e9es de maillage doivent persister pendant des ann\u00e9es, ces fonctionnalit\u00e9s ne sont pas facultatives ; Ils sont essentiels.<\/p>\n<h2>Comprendre l&rsquo;organisation des donn\u00e9es HDF5<\/h2>\n<h3>Groupes et ensembles de donn\u00e9es : les blocs de construction<\/h3>\n<p><strong>Groupes<\/strong> Fournissent des espaces de noms et une organisation logique. Chaque fichier a un groupe racine (<code>\/<\/code>), et vous pouvez cr\u00e9er des groupes imbriqu\u00e9s de mani\u00e8re arbitraire. Les groupes eux-m\u00eames ne stockent aucune donn\u00e9e ; Ils contiennent des liens vers des jeux de donn\u00e9es et d&rsquo;autres groupes.<\/p>\n<p><strong>Les ensembles de donn\u00e9es<\/strong> sont les r\u00e9sultats de votre simulation. Un ensemble de donn\u00e9es est un tableau multidimensionnel avec des dimensions fixes ou extensibles. Mod\u00e8les communs pour les donn\u00e9es de simulation&nbsp;:<\/p>\n<ul>\n<li><strong>Champs 3D<\/strong>&nbsp;: <code>(nx, ny, nz)<\/code> Tableaux pour les variables spatiales<\/li>\n<li><strong>S\u00e9rie chronologique 4D<\/strong>&nbsp;: <code>(nx, ny, nz, nt)<\/code> Tableaux avec temps comme quatri\u00e8me dimension<\/li>\n<li><strong> Tranches 2D<\/strong>&nbsp;: <code>(nx, nt)<\/code> pour les sondes de ligne ou les donn\u00e9es de capteur<\/li>\n<li><strong>Donn\u00e9es structur\u00e9es<\/strong>&nbsp;: types de donn\u00e9es compos\u00e9s pour les propri\u00e9t\u00e9s des particules (position, vitesse, masse)<\/li>\n<\/ul>\n<h3>Espaces de donn\u00e9es&nbsp;: fa\u00e7onnage de vos donn\u00e9es<\/h3>\n<p>Un espace de donn\u00e9es d\u00e9finit la disposition logique d&rsquo;un jeu de donn\u00e9es. HDF5 prend en charge :<\/p>\n<ul>\n<li><strong>Scalaire<\/strong>&nbsp;: valeur unique (0-d)<\/li>\n<li><strong>Simple<\/strong>&nbsp;: tableau r\u00e9gulier \u00e0 n dimensions avec des dimensions fixes ou illimit\u00e9es<\/li>\n<li><strong>Complexe<\/strong>&nbsp;: s\u00e9lections arbitraires utilisant des hyperslaves<\/li>\n<\/ul>\n<p><strong>Dimensions illimit\u00e9es<\/strong> (axes extensibles) sont cruciaux pour les sorties de simulation o\u00f9 le nombre de pas de temps est inconnu au pr\u00e9alable.<\/p>\n<h3>Attributs&nbsp;: le pouvoir d&rsquo;auto-descripteur<\/h3>\n<p>Les attributs sont de petits objets de m\u00e9tadonn\u00e9es attach\u00e9s \u00e0 des groupes ou \u00e0 des ensembles de donn\u00e9es. Ils sont <em>le m\u00e9canisme principal<\/em> pour documenter vos donn\u00e9es[^4]. Utilisez des attributs pour stocker&nbsp;:<\/p>\n<ul>\n<li>Unit\u00e9s physiques (<code>\"m\/s\"<\/code>, <code>\"K\"<\/code>, <code>\"Pa\"<\/code>)<\/li>\n<li>Description Cha\u00eenes<\/li>\n<li>horodatage<\/li>\n<li>Param\u00e8tres de simulation<\/li>\n<li>Informations de citation<\/li>\n<li>Version logicielle utilis\u00e9e<\/li>\n<\/ul>\n<pre><code class=\"language-python\"># Example: Adding attributes with h5py\nimport h5py\n\nwith h5py.File('simulation.h5', 'w') as f:\n    grp = f.create_group('temperature')\n    dset = grp.create_dataset('field', data=temperature_array)\n    \n    dset.attrs['units'] = 'Kelvin'\n    dset.attrs['long_name'] = 'Temperature field'\n    dset.attrs['simulation_time'] = 1234.56\n<\/code><\/pre>\n<h2>E\/S parall\u00e8les avec HDF5<\/h2>\n<h3>Qu&rsquo;est-ce que le HDF5 parall\u00e8le&nbsp;?<\/h3>\n<p>Parallel HDF5 (PHDF5) \u00e9tend la biblioth\u00e8que standard avec la prise en charge MPI-IO, permettant \u00e0 plusieurs processus d&rsquo;acc\u00e9der simultan\u00e9ment au m\u00eame fichier HDF5. Ceci est essentiel pour les simulations \u00e0 grande \u00e9chelle s&rsquo;ex\u00e9cutant sur des clusters HPC o\u00f9 le travail de calcul s&rsquo;\u00e9tend sur des centaines ou des milliers de c\u0153urs[^5].<\/p>\n<h3>Comment cela fonctionne<\/h3>\n<p>Sous le capot, PHDF5 utilise <strong>MPI-IO<\/strong> (le sous-syst\u00e8me d&rsquo;E\/S parall\u00e8le de MPI) pour coordonner l&rsquo;acc\u00e8s. Lors de l&rsquo;ouverture d&rsquo;un fichier en mode parall\u00e8le, tous les processus du communicateur MPI partagent le m\u00eame handle de fichiers et coordonnent les lectures\/\u00e9critures.<\/p>\n<pre><code class=\"language-python\"># Parallel HDF5 example (requires h5py built with MPI support)\nfrom mpi4py import MPI\nimport h5py\n\ncomm = MPI.COMM_WORLD\nrank = comm.Get_rank()\nsize = comm.Get_size()\n\n# Each process opens the file collectively\nwith h5py.File('parallel_output.h5', 'w', driver='mpio', comm=comm) as f:\n    # Create a dataset distributed across all processes\n    # Each process writes its chunk of the global array\n    local_data = compute_local_chunk(rank, size)\n    dset = f.create_dataset('field', (global_nx, global_ny), dtype='f8')\n    # Write using hyperslabs\n    dset[local_slice] = local_data\n<\/code><\/pre>\n<h3>E\/S collectives ou ind\u00e9pendantes<\/h3>\n<p>Une distinction de performances critiques en parall\u00e8le HDF5&nbsp;:<\/p>\n<ul>\n<li><strong>E\/S collectives<\/strong>&nbsp;: tous les processus participent \u00e0 la m\u00eame op\u00e9ration d&rsquo;E\/S. La biblioth\u00e8que MPI peut optimiser le mouvement, l&rsquo;agr\u00e9gation et la bande de donn\u00e9es. <strong>Utilisez ceci chaque fois que possible<\/strong>.<\/li>\n<li><strong>E\/S Ind\u00e9pendante<\/strong>&nbsp;: Chaque processus s&rsquo;ouvre, lit et \u00e9crit ind\u00e9pendamment. Cela entra\u00eene de mauvaises performances en raison de la contention du syst\u00e8me de fichiers et des opportunit\u00e9s d&rsquo;optimisation manqu\u00e9es[^6].<\/li>\n<\/ul>\n<p><strong>Best Practice<\/strong>&nbsp;: structurez votre code afin que tous les processus appellent <code>read()<\/code> ou <code>write()<\/code> en m\u00eame temps avec des s\u00e9lections hyperslaves compatibles. \u00c9vitez les E\/S conditionnelles que seuls certains processus s&rsquo;ex\u00e9cutent.<\/p>\n<h3>Conseils de performances HDF5 parall\u00e8les<\/h3>\n<ol>\n<li><strong>Ecrits d&rsquo;agr\u00e9gats<\/strong>&nbsp;: \u00c9crivez en gros morceaux contigus, pas beaucoup de petits morceaux<\/li>\n<li><strong>Utiliser la mise en m\u00e9moire tampon<\/strong>&nbsp;: laissez le cache de la biblioth\u00e8que MPI et coalesce \u00e9crit<\/li>\n<li><strong>Alignement des morceaux avec la d\u00e9composition du processus<\/strong>&nbsp;: associez un jeu de donn\u00e9es \u00e0 la d\u00e9composition de votre domaine<\/li>\n<li><strong>\u00c9vitez le thrashing du syst\u00e8me de fichiers<\/strong>&nbsp;: utilisez un fichier par \u00e9tape de sortie, et non un seul fichier par processus.<\/li>\n<li><strong>D\u00e9finir la taille de cache de blocs appropri\u00e9e<\/strong>&nbsp;: augmenter le cache pour les ensembles de donn\u00e9es fr\u00e9quemment acc\u00e9d\u00e9s<\/li>\n<\/ol>\n<h2>HDF5 avec Python : la biblioth\u00e8que H5PY<\/h2>\n<p>Le package <a href=\"https:\/\/docs.h5py.org\/en\/latest\/\">H5PY<\/a> fournit l&rsquo;interface la plus pythonic de HDF5[^7].<\/p>\n<h3>Op\u00e9rations de base<\/h3>\n<pre><code class=\"language-python\">import h5py\nimport numpy as np\n\n# Writing data\nwith h5py.File('output.h5', 'w') as f:\n    # Create a dataset\n    data = np.random.randn(1000, 1000)\n    dset = f.create_dataset('temperature', data=data, compression='gzip')\n    \n    # Add attributes\n    dset.attrs['units'] = 'K'\n    dset.attrs['description'] = 'Temperature at final time step'\n    \n    # Create groups for organization\n    grp = f.create_group('initial_conditions')\n    grp.create_dataset('velocity', data=velocity_field)\n\n# Reading data\nwith h5py.File('output.h5', 'r') as f:\n    temp = f['temperature'][:]  # Load entire dataset\n    # Or read a slice\n    slice_ = f['temperature'][100:200, 300:400]\n    \n    # Access attributes\n    units = f['temperature'].attrs['units']\n<\/code><\/pre>\n<h3>\u00c9criture efficace de la sortie de la simulation<\/h3>\n<p>Pour les simulations en fonction du temps, utilisez les <strong>ensembles de donn\u00e9es extensibles<\/strong> avec une dimension temporelle illimit\u00e9e&nbsp;:<\/p>\n<pre><code class=\"language-python\">with h5py.File('time_series.h5', 'w') as f:\n    # Create dataset with unlimited maxshape\n    dset = f.create_dataset(\n        'temperature', \n        shape=(0, nx, ny), \n        maxshape=(None, nx, ny),  # Unlimited time dimension\n        dtype='f8',\n        chunks=(1, nx, ny)  # Chunk along time axis\n    )\n    \n    # Append each time step\n    for t in range(num_steps):\n        current_temp = simulate_step(t)\n        dset.resize((t+1, nx, ny))  # Extend dataset\n        dset[t, :, :] = current_temp\n<\/code><\/pre>\n<h3>Ajouter le mode pour les points de contr\u00f4le<\/h3>\n<p>Utilisez le mode d&rsquo;ajout (<code>'a'<\/code>) pour ajouter une nouvelle sortie aux fichiers existants sans \u00e9craser&nbsp;:<\/p>\n<pre><code class=\"language-python\">with h5py.File('run_001.h5', 'a') as f:\n    if 'checkpoint_002' not in f:\n        f.create_dataset('checkpoint_002', data=new_data)\n<\/code><\/pre>\n<h2>Optimisation des performances : tron\u00e7onnage et compression<\/h2>\n<h3>Chunking : la cl\u00e9 de la performance<\/h3>\n<p>HDF5 stocke les ensembles de donn\u00e9es dans <strong>Chunks<\/strong>&nbsp;: des hyper-rectangles de taille fixe qui sont l&rsquo;unit\u00e9 d&rsquo;E\/S et de compression[^8]. Le morceau est <em>obligatoire<\/em> pour&nbsp;:<\/p>\n<ul>\n<li>Compression d&rsquo;ensemble de donn\u00e9es<\/li>\n<li>Ensembles de donn\u00e9es extensibles<\/li>\n<li>Lectures\/\u00e9critures partielles efficaces<\/li>\n<li>E\/S parall\u00e8le<\/li>\n<\/ul>\n<p><strong>La taille du morceau affecte consid\u00e9rablement les performances<\/strong>&nbsp;:<\/p>\n<ul>\n<li><strong>Trop petit<\/strong>&nbsp;: surcharges de m\u00e9tadonn\u00e9es excessives, taux de compression m\u00e9diocres, surcharge d&rsquo;appels syst\u00e8me \u00e9lev\u00e9e<\/li>\n<li><strong>Trop grand<\/strong>&nbsp;: la lecture d&rsquo;un petit sous-ensemble charge l&rsquo;int\u00e9gralit\u00e9 du morceau en m\u00e9moire, ce qui gaspille la bande passante d&rsquo;E\/S<\/li>\n<\/ul>\n<p><strong>R\u00e8gle du pouce<\/strong>&nbsp;: choisissez des morceaux qui correspondent \u00e0 votre mod\u00e8le d&rsquo;acc\u00e8s typique. Pour les s\u00e9ries chronologiques 3D, acc\u00e9d\u00e9es plan par plan, un bloc comme <code>(1, nx, ny)<\/code> ou <code>(nt, nx, 1)<\/code> en fonction de la dimension la plus rapide.<\/p>\n<pre><code class=\"language-python\"># Optimal chunking for 3D time-series where we read full XY planes\ndset = f.create_dataset(\n    'field',\n    shape=(nt, nx, ny),\n    chunks=(1, nx, ny),  # Each time step is one chunk\n    compression='gzip'\n)\n\n# Reading one time step only decompresses one chunk\ntime_step_50 = dset[50, :, :]\n<\/code><\/pre>\n<h3>Compression : \u00e9change de stockage contre CPU<\/h3>\n<p>HDF5 prend en charge plusieurs filtres de compression sans perte :<\/p>\n<ul>\n<li><strong>GZIP<\/strong> : universelle, bonne compression (2\u20135\u00d7), \u00e0 forte intensit\u00e9 de processeur<\/li>\n<li><strong>Szip<\/strong> : rapide, mat\u00e9riel-acc\u00e9l\u00e9r\u00e9 sur certains syst\u00e8mes, moins portable<\/li>\n<li><strong>LZF<\/strong>&nbsp;: compression tr\u00e8s rapide et mod\u00e9r\u00e9e (2\u00d7)<\/li>\n<li><strong>Blosc<\/strong>&nbsp;: multi-threads hautes performances (via une biblioth\u00e8que externe)<\/li>\n<\/ul>\n<p><strong>Quand compresser<\/strong>&nbsp;:<\/p>\n<ul>\n<li>Stockage d&rsquo;archives o\u00f9 la taille compte plus que la vitesse d&rsquo;\u00e9criture<\/li>\n<li>Charges de travail li\u00e9es aux E\/S o\u00f9 la surcharge de d\u00e9compression est inf\u00e9rieure au temps de lecture du disque<\/li>\n<li>Lorsque les donn\u00e9es sont redondantes (champs lisses, valeurs r\u00e9p\u00e9t\u00e9es)<\/li>\n<\/ul>\n<p><strong>Quand \u00e9viter la compression<\/strong>&nbsp;:<\/p>\n<ul>\n<li>Chemins d&rsquo;\u00e9criture ultra-performants (intervalles de points de contr\u00f4le &lt; 1 seconde)<\/li>\n<li>Donn\u00e9es d\u00e9j\u00e0 compress\u00e9es (images, vid\u00e9os)<\/li>\n<li>Lors de l&rsquo;utilisation d&rsquo;E\/S parall\u00e8les avec des tailles de blocs incompatibles<\/li>\n<\/ul>\n<pre><code class=\"language-python\"># Compression examples\ndset = f.create_dataset('data', data=data, compression='gzip', compression_opts=4)  # gzip level 4\ndset = f.create_dataset('data', data=data, compression='lzf')  # Fast LZF\n<\/code><\/pre>\n<h3>Configuration du cache<\/h3>\n<p>La biblioth\u00e8que HDF5 conserve deux caches&nbsp;:<\/p>\n<ul>\n<li><strong>Cache de m\u00e9tadonn\u00e9es<\/strong>&nbsp;: stocke des informations sur les groupes, les jeux de donn\u00e9es, les attributs<\/li>\n<li><strong>Chunk Cache<\/strong>&nbsp;: conserve les blocs de donn\u00e9es r\u00e9cemment acc\u00e9d\u00e9s<\/li>\n<\/ul>\n<p>Pour les charges de travail critiques pour les performances, r\u00e9glez ces caches via <code>h5py<\/code>&nbsp;:<\/p>\n<pre><code class=\"language-python\">with h5py.File('file.h5', 'w', libver='latest') as f:\n    f.swmr_mode = True  # Enable Single-Writer-Multiple-Reader for concurrent access\n    \n# Configure chunk cache when opening\nwith h5py.File('file.h5', 'r', rdcc_nbytes=1024**3, rdcc_w0=0.75) as f:\n    # 1 GB chunk cache, 75% preemption policy\n    pass\n<\/code><\/pre>\n<h2>Meilleures pratiques d&rsquo;organisation des donn\u00e9es<\/h2>\n<h3>Mod\u00e8les de structure de fichiers<\/h3>\n<p><strong>Single-file-per-run<\/strong>&nbsp;: stockez toutes les sorties d&rsquo;une simulation dans un seul fichier HDF5 avec une hi\u00e9rarchie de groupe claire. Avantages :<\/p>\n<ul>\n<li>Unit\u00e9 de transfert\/archivage unique<\/li>\n<li>Mises \u00e0 jour atomiques (toutes les donn\u00e9es sont \u00e9crites ou aucune)<\/li>\n<li>Plus facile \u00e0 valider l&rsquo;int\u00e9grit\u00e9<\/li>\n<\/ul>\n<p><strong>Checkpoints de plusieurs fichiers<\/strong>&nbsp;: s\u00e9parez les fichiers de point de contr\u00f4le de la sortie finale. Utilisez des liens logiciels pour les connecter&nbsp;:<\/p>\n<pre><code>run_001.h5\n\u251c\u2500\u2500 \/initial (link to checkpoint_000.h5:\/data)\n\u251c\u2500\u2500 \/final\n\u2502   \u2514\u2500\u2500 field (dataset)\n\u2514\u2500\u2500 \/checkpoints (group)\n    \u251c\u2500\u2500 checkpoint_000.h5 (external link)\n    \u251c\u2500\u2500 checkpoint_001.h5 (external link)\n    \u2514\u2500\u2500 checkpoint_002.h5 (external link)\n<\/code><\/pre>\n<h3>Documentez tout avec des attributs<\/h3>\n<p>Les fichiers HDF5 peuvent devenir imp\u00e9n\u00e9trables sans documentation approfondie. <strong>Chaque groupe de donn\u00e9es et chaque groupe doivent avoir des attributs descriptifs<\/strong>[^9]&nbsp;:<\/p>\n<pre><code class=\"language-python\">dset.attrs['units'] = 'm\/s'\ndset.attrs['long_name'] = 'Fluid velocity vector'\ndset.attrs['standard_name'] = 'velocity'\ndset.attrs['positive'] = 'up'  # For vertical components\ndset.attrs['grid_mapping'] = '\/mesh\/x_grid'  # Link to coordinate variables\ndset.attrs['comment'] = 'Computed using second-order upwind scheme'\ndset.attrs['software'] = 'FiPy 3.4'\ndset.attrs['git_commit'] = 'abc123def'\n<\/code><\/pre>\n<p>Envisagez d&rsquo;adopter les <strong>Conventions sur le climat et les pr\u00e9visions (CF)<\/strong> pour les simulations g\u00e9ophysiques ou les normes de m\u00e9tadonn\u00e9es sp\u00e9cifiques \u00e0 un domaine, lorsqu&rsquo;elles sont disponibles.<\/p>\n<h3>\u00c9viter la prolif\u00e9ration des jeux de donn\u00e9es<\/h3>\n<p>Alors que HDF5 autorise des millions d&rsquo;ensembles de donn\u00e9es, les performances se d\u00e9gradent avec un nombre excessif[^10]. Pr\u00e9f\u00e9rez&nbsp;:<\/p>\n<ul>\n<li>Moins de grands ensembles de donn\u00e9es sur de nombreux petits<\/li>\n<li>Types de donn\u00e9es compos\u00e9s pour les champs scalaires associ\u00e9s (par exemple, position des particules + vitesse + masse)<\/li>\n<li>Regroupement de petits tableaux similaires dans un seul ensemble de donn\u00e9es structur\u00e9<\/li>\n<\/ul>\n<h3>d\u00e9fragmenter les fichiers volumineux<\/h3>\n<p>Au fil du temps, les fichiers HDF5 peuvent devenir fragment\u00e9s au fur et \u00e0 mesure que les jeux de donn\u00e9es sont cr\u00e9\u00e9s et supprim\u00e9s. Utilisez <code>h5repack<\/code> pour r\u00e9\u00e9crire les fichiers de mani\u00e8re optimale&nbsp;:<\/p>\n<pre><code class=\"language-bash\">h5repack -f GZIP=4 input.h5 output_compressed.h5\nh5repack -l CHUNK=100x100x100 input.h5 rechunked.h5\n<\/code><\/pre>\n<h2>Alternatives HDF5 vs : NetCDF4, ZARR, CSV<\/h2>\n<h3>R\u00e9sum\u00e9 de la comparaison<\/h3>\n<table>\n<thead>\n<tr>\n<th>Fonctionnalit\u00e9<\/th>\n<th>HDF5<\/th>\n<th>NetCDF-4<\/th>\n<th>zarr<\/th>\n<th>CSV\/JSON<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>E\/S parall\u00e8les<\/strong><\/td>\n<td>\u2705 MPI-IO<\/td>\n<td>\u2705 MPI-IO<\/td>\n<td>\u2705 (Optimis\u00e9 en nuage)<\/td>\n<td>\u274c<\/td>\n<\/tr>\n<tr>\n<td><strong>Compression<\/strong><\/td>\n<td>Plusieurs filtres<\/td>\n<td>Gzip\/Szip<\/td>\n<td>Plusieurs (blosc, gzip)<\/td>\n<td>\u274c<\/td>\n<\/tr>\n<tr>\n<td><strong>Fichier unique<\/strong><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td>\u274c (r\u00e9pertoire)<\/td>\n<td>\u2705<\/td>\n<\/tr>\n<tr>\n<td><strong>Cloud-Natif<\/strong><\/td>\n<td>\u26a0\ufe0f (avec HSD)<\/td>\n<td>\u26a0\ufe0f<\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<\/tr>\n<tr>\n<td><strong>Python-premier<\/strong><\/td>\n<td>\u26a0\ufe0f (H5PY)<\/td>\n<td>\u2705 (NetCDF4)<\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<\/tr>\n<tr>\n<td><strong>m\u00e9tadonn\u00e9es<\/strong><\/td>\n<td>Attributs riches<\/td>\n<td>Conventions de FC<\/td>\n<td>Attributs riches<\/td>\n<td>Limit\u00e9<\/td>\n<\/tr>\n<tr>\n<td><strong>Courbe d&rsquo;apprentissage<\/strong><\/td>\n<td>Raide<\/td>\n<td>Mod\u00e9rer<\/td>\n<td>Facile<\/td>\n<td>Banal<\/td>\n<\/tr>\n<tr>\n<td><strong>Conservation<\/strong><\/td>\n<td>\u2705 Excellent<\/td>\n<td>\u2705 Excellent<\/td>\n<td>\u26a0\ufe0f \u00c9voluant<\/td>\n<td>\u2705 Lisible par l&rsquo;homme<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Quand choisir HDF5<\/h3>\n<ul>\n<li><strong>Environnements HPC<\/strong>&nbsp;: simulations parall\u00e8les bas\u00e9es sur MPI<\/li>\n<li><strong>Archives \u00e0 long terme<\/strong>&nbsp;: format \u00e9prouv\u00e9 avec 20 ans et plus d&rsquo;ant\u00e9c\u00e9dents[^1]<\/li>\n<li><strong>Hi\u00e9rarchies complexes<\/strong>&nbsp;: structures de groupe approfondies, types de donn\u00e9es mixtes<\/li>\n<li><strong>Grandes donn\u00e9es binaires<\/strong>&nbsp;: images, champs 3D, matrices<\/li>\n<li><strong>Cross-langue<\/strong> : besoin de la compatibilit\u00e9 C\/FORTRAN\/MATLAB<\/li>\n<\/ul>\n<h3>Quand netcdf-4 ou zarr peut \u00eatre meilleur<\/h3>\n<ul>\n<li><strong>Climat\/Science atmosph\u00e9rique<\/strong>&nbsp;: NETCDF-4 avec les conventions des FC est la norme communautaire<\/li>\n<li><strong>Cloud Storage<\/strong>&nbsp;: la mise en page de Zarr dans les r\u00e9pertoires fonctionne mieux avec les magasins d&rsquo;objets (S3, GCS)<\/li>\n<li><strong>S\u00e9rie chronologique simple<\/strong>&nbsp;: ZARR ou NETCDF4 proposent des API plus simples<\/li>\n<li><strong>Prototypage rapide<\/strong>&nbsp;: l&rsquo;impl\u00e9mentation de Pure-Python de Zarr n&rsquo;a aucune d\u00e9pendance de compilation en temps de compilation<\/li>\n<\/ul>\n<p>Pour la plupart des <strong>projets de simulation scientifiques<\/strong>, en particulier ceux impliquant des solveurs PDE comme FIPY, HDF5 reste l&rsquo;option la plus capable et la plus largement prise en charge[^11].<\/p>\n<h2>Stockage et conservation \u00e0 long terme<\/h2>\n<h3>Pourquoi HDF5 est de qualit\u00e9 archivistique<\/h3>\n<p>La <strong>Biblioth\u00e8que du Congr\u00e8s<\/strong> et <strong>Archives nationales<\/strong> reconnaissent que HDF5 est un format appropri\u00e9 pour la conservation \u00e0 long terme[^1]. Facteurs cl\u00e9s :<\/p>\n<ul>\n<li><strong>Open Standard<\/strong> : non propri\u00e9taire, maintenu par le groupe HDF (\u00e0 but non lucratif)<\/li>\n<li><strong>Descriptif auto-d\u00e9crit<\/strong>&nbsp;: aucun fichier de sch\u00e9ma externe n&rsquo;est n\u00e9cessaire pour interpr\u00e9ter les donn\u00e9es<\/li>\n<li><strong>Ind\u00e9pendant de la plate-forme<\/strong>&nbsp;: le format binaire fonctionne sur n&rsquo;importe quelle architecture<\/li>\n<li><strong>Adoption large<\/strong>&nbsp;: utilis\u00e9 par la NASA, la NOAA, le DOE, l&rsquo;ESA&nbsp;; Des milliers d&rsquo;outils existent<\/li>\n<li><strong>Sp\u00e9cification stable<\/strong>&nbsp;: HDF5&nbsp;1.10+ est r\u00e9trocompatible&nbsp;; Les changements de format sont rares<\/li>\n<\/ul>\n<h3>Meilleures pratiques de conservation<\/h3>\n<ol>\n<li><strong>Utiliser les formats num\u00e9riques IEEE<\/strong>&nbsp;: \u00e9vitez les formats \u00ab\u00a0natifs\u00a0\u00bb qui lient les donn\u00e9es \u00e0 une endianness mat\u00e9rielle sp\u00e9cifique[^1]<\/li>\n<li><strong>Document \u00e0 fond<\/strong>&nbsp;: inclure des unit\u00e9s, des descriptions, des versions de logiciels et des citations comme attributs<\/li>\n<li><strong>Inclure un README<\/strong>&nbsp;: stocker la documentation lisible par l&rsquo;homme en tant qu&rsquo;attribut ou fichier compagnon<\/li>\n<li><strong>Valider les fichiers<\/strong>&nbsp;: utilisez <code>h5dump<\/code> ou <code>h5py<\/code> pour v\u00e9rifier l&rsquo;int\u00e9grit\u00e9 avant l&rsquo;archivage.<\/li>\n<li><strong>Pr\u00e9servez le logiciel<\/strong>&nbsp;: archivez la version exacte de la biblioth\u00e8que HDF5 (ou un conteneur Docker) utilis\u00e9e pour cr\u00e9er le fichier.<\/li>\n<li><strong>\u00c9vitez la compression exotique<\/strong>&nbsp;: le gzip standard est le plus s\u00fbr&nbsp;; Les filtres personnalis\u00e9s peuvent ne pas \u00eatre pris en charge dans 20&nbsp;ans<\/li>\n<\/ol>\n<h3>Des pi\u00e8ges courants qui risquent des donn\u00e9es<\/h3>\n<ul>\n<li><strong>Aucune journalisation<\/strong>&nbsp;: HDF5 manque de journaux de transactions. Si un processus plante pendant l&rsquo;\u00e9criture, le fichier peut devenir <strong> corruption et irr\u00e9cup\u00e9rable<\/strong>[^12]. \u00c9crivez toujours dans un fichier temporaire et renommez-le \u00e0 la fin.<\/li>\n<li><strong>\u00c9criture parall\u00e8le<\/strong>&nbsp;: plusieurs \u00e9crivains sans synchronisation appropri\u00e9e provoquent la corruption. Utilisez le mode SWMR ou les E\/S collectives.<\/li>\n<li><strong>Types de donn\u00e9es incompatibles<\/strong>&nbsp;: Lecture d&rsquo;un jeu de donn\u00e9es avec le mauvais type de donn\u00e9es d\u00e9forme les donn\u00e9es. V\u00e9rifiez toujours <code>dtype<\/code> les correspondances entre l&rsquo;\u00e9crivain et le lecteur.<\/li>\n<li><strong>La suppression des jeux de donn\u00e9es ne r\u00e9duit pas les fichiers <\/strong>&nbsp;: HDF5 marque l&rsquo;espace comme \u00e9tant libre en interne mais ne r\u00e9duit pas la taille du fichier. Utilisez <code>h5repack<\/code> pour r\u00e9cup\u00e9rer de l&rsquo;espace disque.<\/li>\n<\/ul>\n<h2>Liste de contr\u00f4le pratique : HDF5 pour les projets de simulation<\/h2>\n<p>Avant d&rsquo;utiliser HDF5 dans votre flux de travail de simulation&nbsp;:<\/p>\n<ul>\n<li><input\u00a00> <strong>Choisissez des tailles de blocs<\/strong> en fonction des mod\u00e8les d&rsquo;acc\u00e8s typiques (non arbitraires)<\/input\u00a00><\/li>\n<li><input\u00a00> <strong>Activer la compression<\/strong> pour les sorties d&rsquo;archives, d\u00e9sactivez les donn\u00e9es de point de contr\u00f4le \u00e0 chaud<\/input\u00a00><\/li>\n<li><input\u00a00> <strong>Documentez chaque jeu de donn\u00e9es<\/strong> avec des unit\u00e9s, des descriptions et des logiciels de cr\u00e9ation<\/input\u00a00><\/li>\n<li><input\u00a00> <strong>Utilisez des ensembles de donn\u00e9es extensibles<\/strong> pour les s\u00e9ries chronologiques afin d&rsquo;\u00e9viter la pr\u00e9allocation<\/input\u00a00><\/li>\n<li><input disabled=\"disabled\" type=\"checkbox\"> <strong>Valider les \u00e9critures parall\u00e8les<\/strong> avec des op\u00e9rations collectives et non des E\/S ind\u00e9pendantes<\/li>\n<li><input disabled=\"disabled\" type=\"checkbox\"> <strong>Fermer toutes les poign\u00e9es de fichiers<\/strong> (Utiliser les gestionnaires de contexte&nbsp;: <code>with h5py.File(...)<\/code>)<\/li>\n<li><input\u00a00> <strong>Backup Critical Runs<\/strong> pour s\u00e9parer le stockage avant le post-traitement<\/input\u00a00><\/li>\n<li><input\u00a00> <strong>R\u00e9cup\u00e9ration des tests<\/strong>&nbsp;: simulez des plantages pour s&rsquo;assurer que les fichiers partiels sont d\u00e9tect\u00e9s<\/input\u00a00><\/li>\n<li><input\u00a00> <strong>Consid\u00e9rez NetCDF-4<\/strong> si votre communaut\u00e9 utilise d\u00e9j\u00e0 les conventions de CF<\/input\u00a00><\/li>\n<li><input\u00a00> <strong>Pour le stockage en nuage<\/strong>, \u00e9valuez ZARR comme un format alternatif<\/input\u00a00><\/li>\n<\/ul>\n<h2>Liens internes et guides connexes<\/h2>\n<p>La compr\u00e9hension de HDF5 est cruciale pour g\u00e9rer les sorties de simulation dans divers guides MatForge :<\/p>\n<ul>\n<li><strong><a href=\"\/managing-large-scale-pde-problems-strategies-solvers-and-hpc-case-studies\/\">G\u00e9rer les probl\u00e8mes de PDE \u00e0 grande \u00e9chelle<\/a><\/strong> couvre les strat\u00e9gies HPC dans lesquelles les E\/S parall\u00e8les HDF5 excelle.<\/li>\n<li><strong><a href=\"\/using-fipy-for-phase-field-modeling\/\">Utiliser FIPY pour la mod\u00e9lisation en champ de phase<\/a><\/strong> d\u00e9montre la sauvegarde des r\u00e9sultats de simulation en HDF5 pour une analyse ult\u00e9rieure.<\/li>\n<li><strong><a href=\"\/visualizing-simulation-results-effectively\/\">visualiser efficacement les r\u00e9sultats de la simulation<\/a><\/strong> montre comment lire les sorties HDF5 pour le post-traitement avec Paraview ou MatPlotlib.<\/li>\n<li><strong><a href=\"\/reproducibility-and-its-role-in-debugging\/\">La reproductibilit\u00e9 et son r\u00f4le dans le d\u00e9bogage<\/a><\/strong> expliquent comment la nature auto-d\u00e9crite de HDF5 facilite la recherche reproductible.<\/li>\n<\/ul>\n<h2>recommandations et quand choisir ce<\/h2>\n<p><strong>Pour la plupart des simulations bas\u00e9es sur l&rsquo;EDP<\/strong> (y compris les utilisateurs de Fipy)&nbsp;:<\/p>\n<ol>\n<li><strong>Commencez avec HDF5 + H5PY<\/strong> pour sa maturit\u00e9 et sa prise en charge MPI<\/li>\n<li><strong>Utilisez la compression GZIP<\/strong> au niveau 4-6 pour les sorties d&rsquo;archives (bon \u00e9quilibre entre vitesse\/taille)<\/li>\n<li><strong>Dimensation de temps <\/strong> comme <code>(1, nx, ny)<\/code> pour les s\u00e9ries temporelles 3D<\/li>\n<li><strong>Stocker les tableaux de coordonn\u00e9es<\/strong> (<code>x<\/code>, <code>y<\/code>, <code>z<\/code>) en tant que jeux de donn\u00e9es distincts avec des unit\u00e9s<\/li>\n<li><strong>Ajouter un groupe <code>\/metadata<\/code><\/strong> avec des param\u00e8tres de simulation, des versions de logiciels et des hachages Git<\/li>\n<\/ol>\n<p><strong>Consid\u00e9rez les alternatives quand<\/strong>&nbsp;:<\/p>\n<ul>\n<li>Travailler exclusivement en Python et besoin de stockage cloud natif \u2192 <strong>Zarr<\/strong><\/li>\n<li>Construire des mod\u00e8les climatiques\/atmosph\u00e9riques avec des conventions standard \u2192 <strong>NETCDF-4<\/strong><\/li>\n<li>Besoin de sorties simples lisibles par l&rsquo;homme \u2192 <strong>CSV\/JSON<\/strong> (mais attendez-vous \u00e0 une taille de fichier importante et une E\/S lente)<\/li>\n<\/ul>\n<h2>Conclusion<\/h2>\n<p>HDF5 est la base d&rsquo;une gestion robuste des donn\u00e9es scientifiques. Sa combinaison d&rsquo;organisation hi\u00e9rarchique, d&rsquo;E\/S parall\u00e8les, de compression et de m\u00e9tadonn\u00e9es riches en fait une solution id\u00e9ale pour les sorties de simulation qui doivent persister pendant des ann\u00e9es tout en restant accessibles sur les plates-formes et les langages de programmation.<\/p>\n<p>Cependant, le pouvoir du format vient avec la responsabilit\u00e9. Les mauvais choix de coupure, l&rsquo;ignorance des sch\u00e9mas d&rsquo;E\/S collectifs et les m\u00e9tadonn\u00e9es inad\u00e9quates peuvent compromettre les performances et la convivialit\u00e9 \u00e0 long terme. Suivez les meilleures pratiques d\u00e9crites ici, en particulier en ce qui concerne la strat\u00e9gie de segmentation, la documentation des attributs et les mod\u00e8les d&rsquo;acc\u00e8s parall\u00e8les, pour vous assurer que vos donn\u00e9es de simulation restent \u00e0 la fois performantes et pr\u00e9servables.<\/p>\n<p>Le HDF5 n&rsquo;est pas le format le plus r\u00e9cent, mais ses 20 ans et plus de stabilit\u00e9 et son adoption g\u00e9n\u00e9ralis\u00e9e dans les principales institutions de recherche en font le pari le plus s\u00fbr pour les projets o\u00f9 la long\u00e9vit\u00e9 des donn\u00e9es est importante[^1][^2].<\/p>\n<h2>Lectures compl\u00e9mentaires<\/h2>\n<ul>\n<li><a href=\"https:\/\/support.hdfgroup.org\/documentation\/hdf5\/latest\/\">Guide de l&rsquo;utilisateur HDF5<\/a> (documentation officielle)<\/li>\n<li><a href=\"https:\/\/docs.h5py.org\/en\/latest\/\">Documentation H5PY<\/a><\/li>\n<li><a href=\"https:\/\/www.hdfgroup.org\/2015\/08\/11\/parallel-io-with-hdf5\/\">E\/S parall\u00e8les avec HDF5<\/a> (le blog du groupe HDF)<\/li>\n<li><a href=\"https:\/\/www.earthdata.nasa.gov\/about\/esdis\/esco\/standards-practices\/hdf5\">Meilleures pratiques NASA HDF5<\/a> (NASA EarthData)<\/li>\n<\/ul>\n<hr>\n<p>[^1]&nbsp;: Biblioth\u00e8que du Congr\u00e8s. \u00ab\u00a0HDF5, format de donn\u00e9es hi\u00e9rarchique, version 5.\u00a0\u00bb Format Description Document. Disponible via Clarin&nbsp;: <a href=\"https:\/\/standards.clarin.eu\/sis\/views\/view-format.xq?id=fHDF5\">https:\/\/standards.clarin.eu\/sis\/views\/view-format.xq?id=fhdf5<\/a><br \/> [^2]&nbsp;: le groupe HDF. \u00ab\u00a0HDF5&nbsp;: une nouvelle g\u00e9n\u00e9ration de HDF.\u00a0\u00bb <a href=\"https:\/\/www.hdfgroup.org\/solutions\/hdf5\/\">https:\/\/www.hdfgroup.org\/solutions\/hdf5\/<\/a><br \/> [^3]&nbsp;: groupe HDF. \u00ab\u00a0Mod\u00e8le de donn\u00e9es HDF5 et structure de fichiers.\u00a0\u00bb <a href=\"https:\/\/support.hdfgroup.org\/documentation\/hdf5\/latest\/_h5_d_m__u_g.html\">https:\/\/support.hdfgroup.org\/documentation\/hdf5\/latest\/_h5_d_m_u_g.html<\/a><br \/> [^4]&nbsp;: groupe HDF. \u00ab\u00a0Attributs HDF5.\u00a0\u00bb <a href=\"https:\/\/support.hdfgroup.org\/documentation\/hdf5\/latest\/_h5_a__u_g.html\">https:\/\/support.hdfgroup.org\/documentation\/hdf5\/latest\/_h5_a__u_g.html<\/a><br \/> [^5]&nbsp;: NERSC. \u00ab\u00a0Introduction aux E\/S scientifiques.\u00a0\u00bb <a href=\"https:\/\/support.hdfgroup.org\/documentation\/hdf5-docs\/hdf5_topics\/2016_NERSC_Introduction_to_Scientific_IO.pdf\">https:\/\/support.hdfgroup.org\/documentation\/hdf5-docs\/hdf5_topics\/2016_nersc_introduction_to_scientific_io.pdf<\/a><br \/> [^6]&nbsp;: LRZ. \u00ab\u00a0Guide des meilleures pratiques &#8211; E\/S parall\u00e8les.\u00a0\u00bb <a href=\"https:\/\/doku.lrz.de\/files\/10746566\/10746567\/11\/1755197969103\/Best-Practice-Guide-Parallel-IO.pdf\">https:\/\/doku.lrz.de\/files\/10746566\/10746567\/11\/175 5197969103\/meilleure-pratique-guide-parall\u00e8le-io.pdf<\/a><br \/> [^7]&nbsp;: Projet H5PY. \u00ab\u00a0Documentation H5PY.\u00a0\u00bb <a href=\"https:\/\/docs.h5py.org\/en\/latest\/\">https:\/\/docs.h5py.org\/en\/latest\/<\/a><br \/> [^8]&nbsp;: groupe HDF. \u00ab\u00a0Chunking en HDF5.\u00a0\u00bb <a href=\"https:\/\/support.hdfgroup.org\/documentation\/hdf5-docs\/advanced_topics\/chunking_in_hdf5.html\">https:\/\/support.hdfgroup.org\/documentation\/hdf5-docs\/advanced_topics\/chunking_in_hdf5.html<\/a><br \/> [^9]&nbsp;: groupe HDF. \u00ab\u00a0Obtenir des E\/S hautes performances avec HDF5.\u00a0\u00bb <a href=\"https:\/\/support.hdfgroup.org\/documentation\/hdf5-docs\/hdf5_topics\/20200206_ECPTutorial-final.pdf\">https:\/\/support.hdfgroup.org\/documentation\/hdf5-docs\/hdf5_topics\/20200206_ecptutorial-final.pdf<\/a><br \/> [^10]&nbsp;: Forum HDF. \u00ab\u00a0Des questions sur la taille et le nombre d&rsquo;un ensemble de donn\u00e9es HDF5.\u00a0\u00bb <a href=\"https:\/\/forum.hdfgroup.org\/t\/hdf5-dataset-size-and-number-questions\/12215\">https:\/\/forum.hdfgroup.org\/t\/hdf5-dataset-size-and-number-questions\/12215<\/a><br \/> [^11]&nbsp;: Ambatipudi et al. \u00ab\u00a0Une comparaison de HDF5, ZARR et NETCDF4 dans les op\u00e9rations d&rsquo;E\/S courantes.\u00a0\u00bb arxiv:2207.09503, 2022.<br \/> [^12]&nbsp;: Forum HDF. \u00ab\u00a0HDF5 Corruption ou perte de donn\u00e9es possible&nbsp;?\u00a0\u00bb <a href=\"https:\/\/stackoverflow.com\/questions\/35837243\/hdf5-possible-data-corruption-or-loss\">https:\/\/stackoverflow.com\/questions\/35837243\/hdf5-possible-data-corruption-or-loss<\/a><\/p>\n","protected":false,"raw":"<p>HDF5 est la norme de facto pour le stockage de donn\u00e9es de simulation scientifique \u00e0 grande \u00e9chelle. Sa structure hi\u00e9rarchique, ses capacit\u00e9s d'E\/S parall\u00e8les via MPI et sa compression int\u00e9gr\u00e9e le rendent id\u00e9al pour les environnements de calcul haute performance. Cependant, une utilisation inappropri\u00e9e, en particulier de mauvais choix et des mod\u00e8les d'acc\u00e8s parall\u00e8les incorrects, peut entra\u00eener une grave d\u00e9gradation des performances ou une corruption des donn\u00e9es. Ce guide couvre l'architecture HDF5, la mise en \u0153uvre d'E\/S parall\u00e8les en Python, les techniques d'optimisation des performances et les meilleures pratiques de conservation pour le stockage \u00e0 long terme.<\/p>\n<h2>Introduction : Le d\u00e9fi des donn\u00e9es de simulation<\/h2>\n<p>Les simulations scientifiques g\u00e9n\u00e8rent r\u00e9guli\u00e8rement des t\u00e9raoctets de donn\u00e9es sur des milliers de pas de temps et plusieurs champs physiques. La gestion de ce d\u00e9luge n\u00e9cessite plus qu'un simple format de fichier. Cela exige un syst\u00e8me capable de g\u00e9rer :<\/p>\n<ul>\n<li><strong>\u00c9chelle<\/strong>&nbsp;: gigaoctets en p\u00e9taoctets de tableaux multidimensionnels<\/li>\n<li><strong>performance<\/strong>&nbsp;: lecture\/\u00e9criture efficaces sur les syst\u00e8mes HPC avec des syst\u00e8mes de fichiers parall\u00e8les<\/li>\n<li><strong>Organisation<\/strong>&nbsp;: des structures auto-d\u00e9crivantes qui restent compr\u00e9hensibles des ann\u00e9es plus tard<\/li>\n<li><strong>Durabilit\u00e9<\/strong> : conservation \u00e0 long terme sans obsolescence de format<\/li>\n<li><strong>Access<\/strong>&nbsp;: sous-r\u00e9glage rapide sans lecture de jeux de donn\u00e9es entiers<\/li>\n<\/ul>\n<p>HDF5 (format de donn\u00e9es hi\u00e9rarchique version 5) r\u00e9pond \u00e0 ces d\u00e9fis gr\u00e2ce \u00e0 une combinaison de mod\u00e9lisation de donn\u00e9es flexible, de prise en charge d'E\/S parall\u00e8les et d'int\u00e9gration de m\u00e9tadonn\u00e9es. Largement adopt\u00e9 par la NASA, la NOAA, les laboratoires du DOE et les institutions de recherche, HDF5 est devenu l'\u00e9pine dorsale des archives de donn\u00e9es scientifiques dans le monde[^1][^2].<\/p>\n<h2>Qu'est-ce que le HDF5&nbsp;? Architecture et concepts de base<\/h2>\n<p>HDF5 est \u00e0 la fois un <strong>format de fichier<\/strong> et une <strong>biblioth\u00e8que logicielle<\/strong> qui fournit un conteneur pour des donn\u00e9es scientifiques h\u00e9t\u00e9rog\u00e8nes. Son architecture repose sur six entit\u00e9s fondamentales[^3]&nbsp;:<\/p>\n<ol>\n<li><strong>groupe<\/strong>&nbsp;: objets de conteneur analogues aux r\u00e9pertoires, organisation des donn\u00e9es hi\u00e9rarchique<\/li>\n<li><strong>Dataset<\/strong>&nbsp;: tableaux multidimensionnels contenant des donn\u00e9es num\u00e9riques ou structur\u00e9es r\u00e9elles<\/li>\n<li><strong>espace de donn\u00e9es<\/strong>&nbsp;: d\u00e9crit les dimensions de l'ensemble de donn\u00e9es (forme, rang et \u00e9tendue)<\/li>\n<li><strong>Type de donn\u00e9es<\/strong>&nbsp;: sp\u00e9cifie les types d'\u00e9l\u00e9ments (entiers, flotteurs, cha\u00eenes, compos\u00e9s)<\/li>\n<li><strong>Attribut<\/strong>&nbsp;: petites m\u00e9tadonn\u00e9es attach\u00e9es \u00e0 des groupes ou \u00e0 des ensembles de donn\u00e9es<\/li>\n<li><strong>Link<\/strong>&nbsp;: connecte les objets dans la hi\u00e9rarchie (liens rigides et logiciels)<\/li>\n<\/ol>\n<h3>La structure hi\u00e9rarchique<\/h3>\n<p>Un fichier HDF5 est un graphe dirig\u00e9 avec un seul groupe racine (<code>\/<\/code>). Les groupes peuvent contenir d'autres groupes et ensembles de donn\u00e9es, permettant une imbrication arbitrairement profonde. Cette structure refl\u00e8te un syst\u00e8me de fichiers mais avec des diff\u00e9rences cl\u00e9s :<\/p>\n<ul>\n<li><strong>Auto-descriptif<\/strong>&nbsp;: toutes les m\u00e9tadonn\u00e9es (types de donn\u00e9es, dimensions) se d\u00e9placent avec les donn\u00e9es<\/li>\n<li><strong>Portable<\/strong>&nbsp;: format binaire ind\u00e9pendant de la plate-forme<\/li>\n<li><strong>Extensible<\/strong>&nbsp;: les ensembles de donn\u00e9es peuvent \u00eatre redimensionn\u00e9s et les groupes\/ensembles de donn\u00e9es ajout\u00e9s dynamiquement<\/li>\n<li><strong>Compress\u00e9<\/strong>&nbsp;: le stockage bas\u00e9 sur des blocs permet des filtres de compression par bloc<\/li>\n<\/ul>\n<pre><code>\/simulation\n\u251c\u2500\u2500 metadata\n\u2502   \u251c\u2500\u2500 title (attribute)\n\u2502   \u251c\u2500\u2500 creation_date (attribute)\n\u2502   \u2514\u2500\u2500 parameters (group)\n\u2502       \u251c\u2500\u2500 mesh_size (dataset)\n\u2502       \u2514\u2500\u2500 time_step (dataset)\n\u251c\u2500\u2500 fields\n\u2502   \u251c\u2500\u2500 temperature (dataset, 3D [x,y,z,time])\n\u2502   \u251c\u2500\u2500 velocity (dataset, 4D [x,y,z,time,component])\n\u2502   \u2514\u2500\u2500 pressure (dataset, 3D)\n\u2514\u2500\u2500 output\n    \u251c\u2500\u2500 checkpoint_001.h5 (external link)\n    \u2514\u2500\u2500 checkpoint_002.h5 (external link)\n<\/code><\/pre>\n<h2>Pourquoi HDF5 pour la simulation scientifique ?<\/h2>\n<p>Par rapport aux formats de texte brut (CSV, JSON) ou aux formats binaires plus simples, HDF5 offre des avantages critiques :<\/p>\n<ul>\n<li><strong>E\/S partielle<\/strong>&nbsp;: lecture uniquement des sous-ensembles n\u00e9cessaires sans charger des ensembles de donn\u00e9es entiers<\/li>\n<li><strong>Compression<\/strong>&nbsp;: la compression sans perte (GZIP, SZIP, LZF) r\u00e9duit le stockage de 2 \u00e0 10&nbsp;\u00d7<\/li>\n<li><strong>Acc\u00e8s parall\u00e8le<\/strong>&nbsp;: plusieurs processus peuvent lire\/\u00e9crire simultan\u00e9ment via MPI-IO<\/li>\n<li><strong>Riche des m\u00e9tadonn\u00e9es<\/strong>&nbsp;: attributs des unit\u00e9s de document, des descriptions et de la provenance<\/li>\n<li><strong>Prise en charge des fichiers volumineux<\/strong>&nbsp;: g\u00e8re les fichiers d\u00e9passant 2&nbsp;Go (contrairement \u00e0 l'ancien HDF4)<\/li>\n<li><strong>Plateforme crois\u00e9e<\/strong>&nbsp;: fonctionne sous Linux, macOS, Windows&nbsp;; Prise en charge de Python, C, C++, Fortran, Matlab, R<\/li>\n<\/ul>\n<p>Pour les workflows de simulation, o\u00f9 les fichiers de point de contr\u00f4le, les sorties de s\u00e9ries chronologiques et les donn\u00e9es de maillage doivent persister pendant des ann\u00e9es, ces fonctionnalit\u00e9s ne sont pas facultatives ; Ils sont essentiels.<\/p>\n<h2>Comprendre l'organisation des donn\u00e9es HDF5<\/h2>\n<h3>Groupes et ensembles de donn\u00e9es : les blocs de construction<\/h3>\n<p><strong>Groupes<\/strong> Fournissent des espaces de noms et une organisation logique. Chaque fichier a un groupe racine (<code>\/<\/code>), et vous pouvez cr\u00e9er des groupes imbriqu\u00e9s de mani\u00e8re arbitraire. Les groupes eux-m\u00eames ne stockent aucune donn\u00e9e ; Ils contiennent des liens vers des jeux de donn\u00e9es et d'autres groupes.<\/p>\n<p><strong>Les ensembles de donn\u00e9es<\/strong> sont les r\u00e9sultats de votre simulation. Un ensemble de donn\u00e9es est un tableau multidimensionnel avec des dimensions fixes ou extensibles. Mod\u00e8les communs pour les donn\u00e9es de simulation&nbsp;:<\/p>\n<ul>\n<li><strong>Champs 3D<\/strong>&nbsp;: <code>(nx, ny, nz)<\/code> Tableaux pour les variables spatiales<\/li>\n<li><strong>S\u00e9rie chronologique 4D<\/strong>&nbsp;: <code>(nx, ny, nz, nt)<\/code> Tableaux avec temps comme quatri\u00e8me dimension<\/li>\n<li><strong> Tranches 2D<\/strong>&nbsp;: <code>(nx, nt)<\/code> pour les sondes de ligne ou les donn\u00e9es de capteur<\/li>\n<li><strong>Donn\u00e9es structur\u00e9es<\/strong>&nbsp;: types de donn\u00e9es compos\u00e9s pour les propri\u00e9t\u00e9s des particules (position, vitesse, masse)<\/li>\n<\/ul>\n<h3>Espaces de donn\u00e9es&nbsp;: fa\u00e7onnage de vos donn\u00e9es<\/h3>\n<p>Un espace de donn\u00e9es d\u00e9finit la disposition logique d'un jeu de donn\u00e9es. HDF5 prend en charge :<\/p>\n<ul>\n<li><strong>Scalaire<\/strong>&nbsp;: valeur unique (0-d)<\/li>\n<li><strong>Simple<\/strong>&nbsp;: tableau r\u00e9gulier \u00e0 n dimensions avec des dimensions fixes ou illimit\u00e9es<\/li>\n<li><strong>Complexe<\/strong>&nbsp;: s\u00e9lections arbitraires utilisant des hyperslaves<\/li>\n<\/ul>\n<p><strong>Dimensions illimit\u00e9es<\/strong> (axes extensibles) sont cruciaux pour les sorties de simulation o\u00f9 le nombre de pas de temps est inconnu au pr\u00e9alable.<\/p>\n<h3>Attributs&nbsp;: le pouvoir d'auto-descripteur<\/h3>\n<p>Les attributs sont de petits objets de m\u00e9tadonn\u00e9es attach\u00e9s \u00e0 des groupes ou \u00e0 des ensembles de donn\u00e9es. Ils sont <em>le m\u00e9canisme principal<\/em> pour documenter vos donn\u00e9es[^4]. Utilisez des attributs pour stocker&nbsp;:<\/p>\n<ul>\n<li>Unit\u00e9s physiques (<code>\"m\/s\"<\/code>, <code>\"K\"<\/code>, <code>\"Pa\"<\/code>)<\/li>\n<li>Description Cha\u00eenes<\/li>\n<li>horodatage<\/li>\n<li>Param\u00e8tres de simulation<\/li>\n<li>Informations de citation<\/li>\n<li>Version logicielle utilis\u00e9e<\/li>\n<\/ul>\n<pre><code class=\"language-python\"># Example: Adding attributes with h5py\nimport h5py\n\nwith h5py.File('simulation.h5', 'w') as f:\n    grp = f.create_group('temperature')\n    dset = grp.create_dataset('field', data=temperature_array)\n    \n    dset.attrs['units'] = 'Kelvin'\n    dset.attrs['long_name'] = 'Temperature field'\n    dset.attrs['simulation_time'] = 1234.56\n<\/code><\/pre>\n<h2>E\/S parall\u00e8les avec HDF5<\/h2>\n<h3>Qu'est-ce que le HDF5 parall\u00e8le&nbsp;?<\/h3>\n<p>Parallel HDF5 (PHDF5) \u00e9tend la biblioth\u00e8que standard avec la prise en charge MPI-IO, permettant \u00e0 plusieurs processus d'acc\u00e9der simultan\u00e9ment au m\u00eame fichier HDF5. Ceci est essentiel pour les simulations \u00e0 grande \u00e9chelle s'ex\u00e9cutant sur des clusters HPC o\u00f9 le travail de calcul s'\u00e9tend sur des centaines ou des milliers de c\u0153urs[^5].<\/p>\n<h3>Comment cela fonctionne<\/h3>\n<p>Sous le capot, PHDF5 utilise <strong>MPI-IO<\/strong> (le sous-syst\u00e8me d'E\/S parall\u00e8le de MPI) pour coordonner l'acc\u00e8s. Lors de l'ouverture d'un fichier en mode parall\u00e8le, tous les processus du communicateur MPI partagent le m\u00eame handle de fichiers et coordonnent les lectures\/\u00e9critures.<\/p>\n<pre><code class=\"language-python\"># Parallel HDF5 example (requires h5py built with MPI support)\nfrom mpi4py import MPI\nimport h5py\n\ncomm = MPI.COMM_WORLD\nrank = comm.Get_rank()\nsize = comm.Get_size()\n\n# Each process opens the file collectively\nwith h5py.File('parallel_output.h5', 'w', driver='mpio', comm=comm) as f:\n    # Create a dataset distributed across all processes\n    # Each process writes its chunk of the global array\n    local_data = compute_local_chunk(rank, size)\n    dset = f.create_dataset('field', (global_nx, global_ny), dtype='f8')\n    # Write using hyperslabs\n    dset[local_slice] = local_data\n<\/code><\/pre>\n<h3>E\/S collectives ou ind\u00e9pendantes<\/h3>\n<p>Une distinction de performances critiques en parall\u00e8le HDF5&nbsp;:<\/p>\n<ul>\n<li><strong>E\/S collectives<\/strong>&nbsp;: tous les processus participent \u00e0 la m\u00eame op\u00e9ration d'E\/S. La biblioth\u00e8que MPI peut optimiser le mouvement, l'agr\u00e9gation et la bande de donn\u00e9es. <strong>Utilisez ceci chaque fois que possible<\/strong>.<\/li>\n<li><strong>E\/S Ind\u00e9pendante<\/strong>&nbsp;: Chaque processus s'ouvre, lit et \u00e9crit ind\u00e9pendamment. Cela entra\u00eene de mauvaises performances en raison de la contention du syst\u00e8me de fichiers et des opportunit\u00e9s d'optimisation manqu\u00e9es[^6].<\/li>\n<\/ul>\n<p><strong>Best Practice<\/strong>&nbsp;: structurez votre code afin que tous les processus appellent <code>read()<\/code> ou <code>write()<\/code> en m\u00eame temps avec des s\u00e9lections hyperslaves compatibles. \u00c9vitez les E\/S conditionnelles que seuls certains processus s'ex\u00e9cutent.<\/p>\n<h3>Conseils de performances HDF5 parall\u00e8les<\/h3>\n<ol>\n<li><strong>Ecrits d'agr\u00e9gats<\/strong>&nbsp;: \u00c9crivez en gros morceaux contigus, pas beaucoup de petits morceaux<\/li>\n<li><strong>Utiliser la mise en m\u00e9moire tampon<\/strong>&nbsp;: laissez le cache de la biblioth\u00e8que MPI et coalesce \u00e9crit<\/li>\n<li><strong>Alignement des morceaux avec la d\u00e9composition du processus<\/strong>&nbsp;: associez un jeu de donn\u00e9es \u00e0 la d\u00e9composition de votre domaine<\/li>\n<li><strong>\u00c9vitez le thrashing du syst\u00e8me de fichiers<\/strong>&nbsp;: utilisez un fichier par \u00e9tape de sortie, et non un seul fichier par processus.<\/li>\n<li><strong>D\u00e9finir la taille de cache de blocs appropri\u00e9e<\/strong>&nbsp;: augmenter le cache pour les ensembles de donn\u00e9es fr\u00e9quemment acc\u00e9d\u00e9s<\/li>\n<\/ol>\n<h2>HDF5 avec Python : la biblioth\u00e8que H5PY<\/h2>\n<p>Le package <a href=\"https:\/\/docs.h5py.org\/en\/latest\/\">H5PY<\/a> fournit l'interface la plus pythonic de HDF5[^7].<\/p>\n<h3>Op\u00e9rations de base<\/h3>\n<pre><code class=\"language-python\">import h5py\nimport numpy as np\n\n# Writing data\nwith h5py.File('output.h5', 'w') as f:\n    # Create a dataset\n    data = np.random.randn(1000, 1000)\n    dset = f.create_dataset('temperature', data=data, compression='gzip')\n    \n    # Add attributes\n    dset.attrs['units'] = 'K'\n    dset.attrs['description'] = 'Temperature at final time step'\n    \n    # Create groups for organization\n    grp = f.create_group('initial_conditions')\n    grp.create_dataset('velocity', data=velocity_field)\n\n# Reading data\nwith h5py.File('output.h5', 'r') as f:\n    temp = f['temperature'][:]  # Load entire dataset\n    # Or read a slice\n    slice_ = f['temperature'][100:200, 300:400]\n    \n    # Access attributes\n    units = f['temperature'].attrs['units']\n<\/code><\/pre>\n<h3>\u00c9criture efficace de la sortie de la simulation<\/h3>\n<p>Pour les simulations en fonction du temps, utilisez les <strong>ensembles de donn\u00e9es extensibles<\/strong> avec une dimension temporelle illimit\u00e9e&nbsp;:<\/p>\n<pre><code class=\"language-python\">with h5py.File('time_series.h5', 'w') as f:\n    # Create dataset with unlimited maxshape\n    dset = f.create_dataset(\n        'temperature', \n        shape=(0, nx, ny), \n        maxshape=(None, nx, ny),  # Unlimited time dimension\n        dtype='f8',\n        chunks=(1, nx, ny)  # Chunk along time axis\n    )\n    \n    # Append each time step\n    for t in range(num_steps):\n        current_temp = simulate_step(t)\n        dset.resize((t+1, nx, ny))  # Extend dataset\n        dset[t, :, :] = current_temp\n<\/code><\/pre>\n<h3>Ajouter le mode pour les points de contr\u00f4le<\/h3>\n<p>Utilisez le mode d'ajout (<code>'a'<\/code>) pour ajouter une nouvelle sortie aux fichiers existants sans \u00e9craser&nbsp;:<\/p>\n<pre><code class=\"language-python\">with h5py.File('run_001.h5', 'a') as f:\n    if 'checkpoint_002' not in f:\n        f.create_dataset('checkpoint_002', data=new_data)\n<\/code><\/pre>\n<h2>Optimisation des performances : tron\u00e7onnage et compression<\/h2>\n<h3>Chunking : la cl\u00e9 de la performance<\/h3>\n<p>HDF5 stocke les ensembles de donn\u00e9es dans <strong>Chunks<\/strong>&nbsp;: des hyper-rectangles de taille fixe qui sont l'unit\u00e9 d'E\/S et de compression[^8]. Le morceau est <em>obligatoire<\/em> pour&nbsp;:<\/p>\n<ul>\n<li>Compression d'ensemble de donn\u00e9es<\/li>\n<li>Ensembles de donn\u00e9es extensibles<\/li>\n<li>Lectures\/\u00e9critures partielles efficaces<\/li>\n<li>E\/S parall\u00e8le<\/li>\n<\/ul>\n<p><strong>La taille du morceau affecte consid\u00e9rablement les performances<\/strong>&nbsp;:<\/p>\n<ul>\n<li><strong>Trop petit<\/strong>&nbsp;: surcharges de m\u00e9tadonn\u00e9es excessives, taux de compression m\u00e9diocres, surcharge d'appels syst\u00e8me \u00e9lev\u00e9e<\/li>\n<li><strong>Trop grand<\/strong>&nbsp;: la lecture d'un petit sous-ensemble charge l'int\u00e9gralit\u00e9 du morceau en m\u00e9moire, ce qui gaspille la bande passante d'E\/S<\/li>\n<\/ul>\n<p><strong>R\u00e8gle du pouce<\/strong>&nbsp;: choisissez des morceaux qui correspondent \u00e0 votre mod\u00e8le d'acc\u00e8s typique. Pour les s\u00e9ries chronologiques 3D, acc\u00e9d\u00e9es plan par plan, un bloc comme <code>(1, nx, ny)<\/code> ou <code>(nt, nx, 1)<\/code> en fonction de la dimension la plus rapide.<\/p>\n<pre><code class=\"language-python\"># Optimal chunking for 3D time-series where we read full XY planes\ndset = f.create_dataset(\n    'field',\n    shape=(nt, nx, ny),\n    chunks=(1, nx, ny),  # Each time step is one chunk\n    compression='gzip'\n)\n\n# Reading one time step only decompresses one chunk\ntime_step_50 = dset[50, :, :]\n<\/code><\/pre>\n<h3>Compression : \u00e9change de stockage contre CPU<\/h3>\n<p>HDF5 prend en charge plusieurs filtres de compression sans perte :<\/p>\n<ul>\n<li><strong>GZIP<\/strong> : universelle, bonne compression (2\u20135\u00d7), \u00e0 forte intensit\u00e9 de processeur<\/li>\n<li><strong>Szip<\/strong> : rapide, mat\u00e9riel-acc\u00e9l\u00e9r\u00e9 sur certains syst\u00e8mes, moins portable<\/li>\n<li><strong>LZF<\/strong>&nbsp;: compression tr\u00e8s rapide et mod\u00e9r\u00e9e (2\u00d7)<\/li>\n<li><strong>Blosc<\/strong>&nbsp;: multi-threads hautes performances (via une biblioth\u00e8que externe)<\/li>\n<\/ul>\n<p><strong>Quand compresser<\/strong>&nbsp;:<\/p>\n<ul>\n<li>Stockage d'archives o\u00f9 la taille compte plus que la vitesse d'\u00e9criture<\/li>\n<li>Charges de travail li\u00e9es aux E\/S o\u00f9 la surcharge de d\u00e9compression est inf\u00e9rieure au temps de lecture du disque<\/li>\n<li>Lorsque les donn\u00e9es sont redondantes (champs lisses, valeurs r\u00e9p\u00e9t\u00e9es)<\/li>\n<\/ul>\n<p><strong>Quand \u00e9viter la compression<\/strong>&nbsp;:<\/p>\n<ul>\n<li>Chemins d'\u00e9criture ultra-performants (intervalles de points de contr\u00f4le &lt; 1 seconde)<\/li>\n<li>Donn\u00e9es d\u00e9j\u00e0 compress\u00e9es (images, vid\u00e9os)<\/li>\n<li>Lors de l'utilisation d'E\/S parall\u00e8les avec des tailles de blocs incompatibles<\/li>\n<\/ul>\n<pre><code class=\"language-python\"># Compression examples\ndset = f.create_dataset('data', data=data, compression='gzip', compression_opts=4)  # gzip level 4\ndset = f.create_dataset('data', data=data, compression='lzf')  # Fast LZF\n<\/code><\/pre>\n<h3>Configuration du cache<\/h3>\n<p>La biblioth\u00e8que HDF5 conserve deux caches&nbsp;:<\/p>\n<ul>\n<li><strong>Cache de m\u00e9tadonn\u00e9es<\/strong>&nbsp;: stocke des informations sur les groupes, les jeux de donn\u00e9es, les attributs<\/li>\n<li><strong>Chunk Cache<\/strong>&nbsp;: conserve les blocs de donn\u00e9es r\u00e9cemment acc\u00e9d\u00e9s<\/li>\n<\/ul>\n<p>Pour les charges de travail critiques pour les performances, r\u00e9glez ces caches via <code>h5py<\/code>&nbsp;:<\/p>\n<pre><code class=\"language-python\">with h5py.File('file.h5', 'w', libver='latest') as f:\n    f.swmr_mode = True  # Enable Single-Writer-Multiple-Reader for concurrent access\n    \n# Configure chunk cache when opening\nwith h5py.File('file.h5', 'r', rdcc_nbytes=1024**3, rdcc_w0=0.75) as f:\n    # 1 GB chunk cache, 75% preemption policy\n    pass\n<\/code><\/pre>\n<h2>Meilleures pratiques d'organisation des donn\u00e9es<\/h2>\n<h3>Mod\u00e8les de structure de fichiers<\/h3>\n<p><strong>Single-file-per-run<\/strong>&nbsp;: stockez toutes les sorties d'une simulation dans un seul fichier HDF5 avec une hi\u00e9rarchie de groupe claire. Avantages :<\/p>\n<ul>\n<li>Unit\u00e9 de transfert\/archivage unique<\/li>\n<li>Mises \u00e0 jour atomiques (toutes les donn\u00e9es sont \u00e9crites ou aucune)<\/li>\n<li>Plus facile \u00e0 valider l'int\u00e9grit\u00e9<\/li>\n<\/ul>\n<p><strong>Checkpoints de plusieurs fichiers<\/strong>&nbsp;: s\u00e9parez les fichiers de point de contr\u00f4le de la sortie finale. Utilisez des liens logiciels pour les connecter&nbsp;:<\/p>\n<pre><code>run_001.h5\n\u251c\u2500\u2500 \/initial (link to checkpoint_000.h5:\/data)\n\u251c\u2500\u2500 \/final\n\u2502   \u2514\u2500\u2500 field (dataset)\n\u2514\u2500\u2500 \/checkpoints (group)\n    \u251c\u2500\u2500 checkpoint_000.h5 (external link)\n    \u251c\u2500\u2500 checkpoint_001.h5 (external link)\n    \u2514\u2500\u2500 checkpoint_002.h5 (external link)\n<\/code><\/pre>\n<h3>Documentez tout avec des attributs<\/h3>\n<p>Les fichiers HDF5 peuvent devenir imp\u00e9n\u00e9trables sans documentation approfondie. <strong>Chaque groupe de donn\u00e9es et chaque groupe doivent avoir des attributs descriptifs<\/strong>[^9]&nbsp;:<\/p>\n<pre><code class=\"language-python\">dset.attrs['units'] = 'm\/s'\ndset.attrs['long_name'] = 'Fluid velocity vector'\ndset.attrs['standard_name'] = 'velocity'\ndset.attrs['positive'] = 'up'  # For vertical components\ndset.attrs['grid_mapping'] = '\/mesh\/x_grid'  # Link to coordinate variables\ndset.attrs['comment'] = 'Computed using second-order upwind scheme'\ndset.attrs['software'] = 'FiPy 3.4'\ndset.attrs['git_commit'] = 'abc123def'\n<\/code><\/pre>\n<p>Envisagez d'adopter les <strong>Conventions sur le climat et les pr\u00e9visions (CF)<\/strong> pour les simulations g\u00e9ophysiques ou les normes de m\u00e9tadonn\u00e9es sp\u00e9cifiques \u00e0 un domaine, lorsqu'elles sont disponibles.<\/p>\n<h3>\u00c9viter la prolif\u00e9ration des jeux de donn\u00e9es<\/h3>\n<p>Alors que HDF5 autorise des millions d'ensembles de donn\u00e9es, les performances se d\u00e9gradent avec un nombre excessif[^10]. Pr\u00e9f\u00e9rez&nbsp;:<\/p>\n<ul>\n<li>Moins de grands ensembles de donn\u00e9es sur de nombreux petits<\/li>\n<li>Types de donn\u00e9es compos\u00e9s pour les champs scalaires associ\u00e9s (par exemple, position des particules + vitesse + masse)<\/li>\n<li>Regroupement de petits tableaux similaires dans un seul ensemble de donn\u00e9es structur\u00e9<\/li>\n<\/ul>\n<h3>d\u00e9fragmenter les fichiers volumineux<\/h3>\n<p>Au fil du temps, les fichiers HDF5 peuvent devenir fragment\u00e9s au fur et \u00e0 mesure que les jeux de donn\u00e9es sont cr\u00e9\u00e9s et supprim\u00e9s. Utilisez <code>h5repack<\/code> pour r\u00e9\u00e9crire les fichiers de mani\u00e8re optimale&nbsp;:<\/p>\n<pre><code class=\"language-bash\">h5repack -f GZIP=4 input.h5 output_compressed.h5\nh5repack -l CHUNK=100x100x100 input.h5 rechunked.h5\n<\/code><\/pre>\n<h2>Alternatives HDF5 vs : NetCDF4, ZARR, CSV<\/h2>\n<h3>R\u00e9sum\u00e9 de la comparaison<\/h3>\n<table>\n<thead>\n<tr>\n<th>Fonctionnalit\u00e9<\/th>\n<th>HDF5<\/th>\n<th>NetCDF-4<\/th>\n<th>zarr<\/th>\n<th>CSV\/JSON<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>E\/S parall\u00e8les<\/strong><\/td>\n<td>\u2705 MPI-IO<\/td>\n<td>\u2705 MPI-IO<\/td>\n<td>\u2705 (Optimis\u00e9 en nuage)<\/td>\n<td>\u274c<\/td>\n<\/tr>\n<tr>\n<td><strong>Compression<\/strong><\/td>\n<td>Plusieurs filtres<\/td>\n<td>Gzip\/Szip<\/td>\n<td>Plusieurs (blosc, gzip)<\/td>\n<td>\u274c<\/td>\n<\/tr>\n<tr>\n<td><strong>Fichier unique<\/strong><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td>\u274c (r\u00e9pertoire)<\/td>\n<td>\u2705<\/td>\n<\/tr>\n<tr>\n<td><strong>Cloud-Natif<\/strong><\/td>\n<td>\u26a0\ufe0f (avec HSD)<\/td>\n<td>\u26a0\ufe0f<\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<\/tr>\n<tr>\n<td><strong>Python-premier<\/strong><\/td>\n<td>\u26a0\ufe0f (H5PY)<\/td>\n<td>\u2705 (NetCDF4)<\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<\/tr>\n<tr>\n<td><strong>m\u00e9tadonn\u00e9es<\/strong><\/td>\n<td>Attributs riches<\/td>\n<td>Conventions de FC<\/td>\n<td>Attributs riches<\/td>\n<td>Limit\u00e9<\/td>\n<\/tr>\n<tr>\n<td><strong>Courbe d'apprentissage<\/strong><\/td>\n<td>Raide<\/td>\n<td>Mod\u00e9rer<\/td>\n<td>Facile<\/td>\n<td>Banal<\/td>\n<\/tr>\n<tr>\n<td><strong>Conservation<\/strong><\/td>\n<td>\u2705 Excellent<\/td>\n<td>\u2705 Excellent<\/td>\n<td>\u26a0\ufe0f \u00c9voluant<\/td>\n<td>\u2705 Lisible par l'homme<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Quand choisir HDF5<\/h3>\n<ul>\n<li><strong>Environnements HPC<\/strong>&nbsp;: simulations parall\u00e8les bas\u00e9es sur MPI<\/li>\n<li><strong>Archives \u00e0 long terme<\/strong>&nbsp;: format \u00e9prouv\u00e9 avec 20 ans et plus d'ant\u00e9c\u00e9dents[^1]<\/li>\n<li><strong>Hi\u00e9rarchies complexes<\/strong>&nbsp;: structures de groupe approfondies, types de donn\u00e9es mixtes<\/li>\n<li><strong>Grandes donn\u00e9es binaires<\/strong>&nbsp;: images, champs 3D, matrices<\/li>\n<li><strong>Cross-langue<\/strong> : besoin de la compatibilit\u00e9 C\/FORTRAN\/MATLAB<\/li>\n<\/ul>\n<h3>Quand netcdf-4 ou zarr peut \u00eatre meilleur<\/h3>\n<ul>\n<li><strong>Climat\/Science atmosph\u00e9rique<\/strong>&nbsp;: NETCDF-4 avec les conventions des FC est la norme communautaire<\/li>\n<li><strong>Cloud Storage<\/strong>&nbsp;: la mise en page de Zarr dans les r\u00e9pertoires fonctionne mieux avec les magasins d'objets (S3, GCS)<\/li>\n<li><strong>S\u00e9rie chronologique simple<\/strong>&nbsp;: ZARR ou NETCDF4 proposent des API plus simples<\/li>\n<li><strong>Prototypage rapide<\/strong>&nbsp;: l'impl\u00e9mentation de Pure-Python de Zarr n'a aucune d\u00e9pendance de compilation en temps de compilation<\/li>\n<\/ul>\n<p>Pour la plupart des <strong>projets de simulation scientifiques<\/strong>, en particulier ceux impliquant des solveurs PDE comme FIPY, HDF5 reste l'option la plus capable et la plus largement prise en charge[^11].<\/p>\n<h2>Stockage et conservation \u00e0 long terme<\/h2>\n<h3>Pourquoi HDF5 est de qualit\u00e9 archivistique<\/h3>\n<p>La <strong>Biblioth\u00e8que du Congr\u00e8s<\/strong> et <strong>Archives nationales<\/strong> reconnaissent que HDF5 est un format appropri\u00e9 pour la conservation \u00e0 long terme[^1]. Facteurs cl\u00e9s :<\/p>\n<ul>\n<li><strong>Open Standard<\/strong> : non propri\u00e9taire, maintenu par le groupe HDF (\u00e0 but non lucratif)<\/li>\n<li><strong>Descriptif auto-d\u00e9crit<\/strong>&nbsp;: aucun fichier de sch\u00e9ma externe n'est n\u00e9cessaire pour interpr\u00e9ter les donn\u00e9es<\/li>\n<li><strong>Ind\u00e9pendant de la plate-forme<\/strong>&nbsp;: le format binaire fonctionne sur n'importe quelle architecture<\/li>\n<li><strong>Adoption large<\/strong>&nbsp;: utilis\u00e9 par la NASA, la NOAA, le DOE, l'ESA&nbsp;; Des milliers d'outils existent<\/li>\n<li><strong>Sp\u00e9cification stable<\/strong>&nbsp;: HDF5&nbsp;1.10+ est r\u00e9trocompatible&nbsp;; Les changements de format sont rares<\/li>\n<\/ul>\n<h3>Meilleures pratiques de conservation<\/h3>\n<ol>\n<li><strong>Utiliser les formats num\u00e9riques IEEE<\/strong>&nbsp;: \u00e9vitez les formats \"natifs\" qui lient les donn\u00e9es \u00e0 une endianness mat\u00e9rielle sp\u00e9cifique[^1]<\/li>\n<li><strong>Document \u00e0 fond<\/strong>&nbsp;: inclure des unit\u00e9s, des descriptions, des versions de logiciels et des citations comme attributs<\/li>\n<li><strong>Inclure un README<\/strong>&nbsp;: stocker la documentation lisible par l'homme en tant qu'attribut ou fichier compagnon<\/li>\n<li><strong>Valider les fichiers<\/strong>&nbsp;: utilisez <code>h5dump<\/code> ou <code>h5py<\/code> pour v\u00e9rifier l'int\u00e9grit\u00e9 avant l'archivage.<\/li>\n<li><strong>Pr\u00e9servez le logiciel<\/strong>&nbsp;: archivez la version exacte de la biblioth\u00e8que HDF5 (ou un conteneur Docker) utilis\u00e9e pour cr\u00e9er le fichier.<\/li>\n<li><strong>\u00c9vitez la compression exotique<\/strong>&nbsp;: le gzip standard est le plus s\u00fbr&nbsp;; Les filtres personnalis\u00e9s peuvent ne pas \u00eatre pris en charge dans 20&nbsp;ans<\/li>\n<\/ol>\n<h3>Des pi\u00e8ges courants qui risquent des donn\u00e9es<\/h3>\n<ul>\n<li><strong>Aucune journalisation<\/strong>&nbsp;: HDF5 manque de journaux de transactions. Si un processus plante pendant l'\u00e9criture, le fichier peut devenir <strong> corruption et irr\u00e9cup\u00e9rable<\/strong>[^12]. \u00c9crivez toujours dans un fichier temporaire et renommez-le \u00e0 la fin.<\/li>\n<li><strong>\u00c9criture parall\u00e8le<\/strong>&nbsp;: plusieurs \u00e9crivains sans synchronisation appropri\u00e9e provoquent la corruption. Utilisez le mode SWMR ou les E\/S collectives.<\/li>\n<li><strong>Types de donn\u00e9es incompatibles<\/strong>&nbsp;: Lecture d'un jeu de donn\u00e9es avec le mauvais type de donn\u00e9es d\u00e9forme les donn\u00e9es. V\u00e9rifiez toujours <code>dtype<\/code> les correspondances entre l'\u00e9crivain et le lecteur.<\/li>\n<li><strong>La suppression des jeux de donn\u00e9es ne r\u00e9duit pas les fichiers <\/strong>&nbsp;: HDF5 marque l'espace comme \u00e9tant libre en interne mais ne r\u00e9duit pas la taille du fichier. Utilisez <code>h5repack<\/code> pour r\u00e9cup\u00e9rer de l'espace disque.<\/li>\n<\/ul>\n<h2>Liste de contr\u00f4le pratique : HDF5 pour les projets de simulation<\/h2>\n<p>Avant d'utiliser HDF5 dans votre flux de travail de simulation&nbsp;:<\/p>\n<ul>\n<li><input\u00a00> <strong>Choisissez des tailles de blocs<\/strong> en fonction des mod\u00e8les d'acc\u00e8s typiques (non arbitraires)<\/input\u00a00><\/li>\n<li><input\u00a00> <strong>Activer la compression<\/strong> pour les sorties d'archives, d\u00e9sactivez les donn\u00e9es de point de contr\u00f4le \u00e0 chaud<\/input\u00a00><\/li>\n<li><input\u00a00> <strong>Documentez chaque jeu de donn\u00e9es<\/strong> avec des unit\u00e9s, des descriptions et des logiciels de cr\u00e9ation<\/input\u00a00><\/li>\n<li><input\u00a00> <strong>Utilisez des ensembles de donn\u00e9es extensibles<\/strong> pour les s\u00e9ries chronologiques afin d'\u00e9viter la pr\u00e9allocation<\/input\u00a00><\/li>\n<li><input disabled=\"disabled\" type=\"checkbox\"> <strong>Valider les \u00e9critures parall\u00e8les<\/strong> avec des op\u00e9rations collectives et non des E\/S ind\u00e9pendantes<\/li>\n<li><input disabled=\"disabled\" type=\"checkbox\"> <strong>Fermer toutes les poign\u00e9es de fichiers<\/strong> (Utiliser les gestionnaires de contexte&nbsp;: <code>with h5py.File(...)<\/code>)<\/li>\n<li><input\u00a00> <strong>Backup Critical Runs<\/strong> pour s\u00e9parer le stockage avant le post-traitement<\/input\u00a00><\/li>\n<li><input\u00a00> <strong>R\u00e9cup\u00e9ration des tests<\/strong>&nbsp;: simulez des plantages pour s'assurer que les fichiers partiels sont d\u00e9tect\u00e9s<\/input\u00a00><\/li>\n<li><input\u00a00> <strong>Consid\u00e9rez NetCDF-4<\/strong> si votre communaut\u00e9 utilise d\u00e9j\u00e0 les conventions de CF<\/input\u00a00><\/li>\n<li><input\u00a00> <strong>Pour le stockage en nuage<\/strong>, \u00e9valuez ZARR comme un format alternatif<\/input\u00a00><\/li>\n<\/ul>\n<h2>Liens internes et guides connexes<\/h2>\n<p>La compr\u00e9hension de HDF5 est cruciale pour g\u00e9rer les sorties de simulation dans divers guides MatForge :<\/p>\n<ul>\n<li><strong><a href=\"\/managing-large-scale-pde-problems-strategies-solvers-and-hpc-case-studies\/\">G\u00e9rer les probl\u00e8mes de PDE \u00e0 grande \u00e9chelle<\/a><\/strong> couvre les strat\u00e9gies HPC dans lesquelles les E\/S parall\u00e8les HDF5 excelle.<\/li>\n<li><strong><a href=\"\/using-fipy-for-phase-field-modeling\/\">Utiliser FIPY pour la mod\u00e9lisation en champ de phase<\/a><\/strong> d\u00e9montre la sauvegarde des r\u00e9sultats de simulation en HDF5 pour une analyse ult\u00e9rieure.<\/li>\n<li><strong><a href=\"\/visualizing-simulation-results-effectively\/\">visualiser efficacement les r\u00e9sultats de la simulation<\/a><\/strong> montre comment lire les sorties HDF5 pour le post-traitement avec Paraview ou MatPlotlib.<\/li>\n<li><strong><a href=\"\/reproducibility-and-its-role-in-debugging\/\">La reproductibilit\u00e9 et son r\u00f4le dans le d\u00e9bogage<\/a><\/strong> expliquent comment la nature auto-d\u00e9crite de HDF5 facilite la recherche reproductible.<\/li>\n<\/ul>\n<h2>recommandations et quand choisir ce<\/h2>\n<p><strong>Pour la plupart des simulations bas\u00e9es sur l'EDP<\/strong> (y compris les utilisateurs de Fipy)&nbsp;:<\/p>\n<ol>\n<li><strong>Commencez avec HDF5 + H5PY<\/strong> pour sa maturit\u00e9 et sa prise en charge MPI<\/li>\n<li><strong>Utilisez la compression GZIP<\/strong> au niveau 4-6 pour les sorties d'archives (bon \u00e9quilibre entre vitesse\/taille)<\/li>\n<li><strong>Dimensation de temps <\/strong> comme <code>(1, nx, ny)<\/code> pour les s\u00e9ries temporelles 3D<\/li>\n<li><strong>Stocker les tableaux de coordonn\u00e9es<\/strong> (<code>x<\/code>, <code>y<\/code>, <code>z<\/code>) en tant que jeux de donn\u00e9es distincts avec des unit\u00e9s<\/li>\n<li><strong>Ajouter un groupe <code>\/metadata<\/code><\/strong> avec des param\u00e8tres de simulation, des versions de logiciels et des hachages Git<\/li>\n<\/ol>\n<p><strong>Consid\u00e9rez les alternatives quand<\/strong>&nbsp;:<\/p>\n<ul>\n<li>Travailler exclusivement en Python et besoin de stockage cloud natif \u2192 <strong>Zarr<\/strong><\/li>\n<li>Construire des mod\u00e8les climatiques\/atmosph\u00e9riques avec des conventions standard \u2192 <strong>NETCDF-4<\/strong><\/li>\n<li>Besoin de sorties simples lisibles par l'homme \u2192 <strong>CSV\/JSON<\/strong> (mais attendez-vous \u00e0 une taille de fichier importante et une E\/S lente)<\/li>\n<\/ul>\n<h2>Conclusion<\/h2>\n<p>HDF5 est la base d'une gestion robuste des donn\u00e9es scientifiques. Sa combinaison d'organisation hi\u00e9rarchique, d'E\/S parall\u00e8les, de compression et de m\u00e9tadonn\u00e9es riches en fait une solution id\u00e9ale pour les sorties de simulation qui doivent persister pendant des ann\u00e9es tout en restant accessibles sur les plates-formes et les langages de programmation.<\/p>\n<p>Cependant, le pouvoir du format vient avec la responsabilit\u00e9. Les mauvais choix de coupure, l'ignorance des sch\u00e9mas d'E\/S collectifs et les m\u00e9tadonn\u00e9es inad\u00e9quates peuvent compromettre les performances et la convivialit\u00e9 \u00e0 long terme. Suivez les meilleures pratiques d\u00e9crites ici, en particulier en ce qui concerne la strat\u00e9gie de segmentation, la documentation des attributs et les mod\u00e8les d'acc\u00e8s parall\u00e8les, pour vous assurer que vos donn\u00e9es de simulation restent \u00e0 la fois performantes et pr\u00e9servables.<\/p>\n<p>Le HDF5 n'est pas le format le plus r\u00e9cent, mais ses 20 ans et plus de stabilit\u00e9 et son adoption g\u00e9n\u00e9ralis\u00e9e dans les principales institutions de recherche en font le pari le plus s\u00fbr pour les projets o\u00f9 la long\u00e9vit\u00e9 des donn\u00e9es est importante[^1][^2].<\/p>\n<h2>Lectures compl\u00e9mentaires<\/h2>\n<ul>\n<li><a href=\"https:\/\/support.hdfgroup.org\/documentation\/hdf5\/latest\/\">Guide de l'utilisateur HDF5<\/a> (documentation officielle)<\/li>\n<li><a href=\"https:\/\/docs.h5py.org\/en\/latest\/\">Documentation H5PY<\/a><\/li>\n<li><a href=\"https:\/\/www.hdfgroup.org\/2015\/08\/11\/parallel-io-with-hdf5\/\">E\/S parall\u00e8les avec HDF5<\/a> (le blog du groupe HDF)<\/li>\n<li><a href=\"https:\/\/www.earthdata.nasa.gov\/about\/esdis\/esco\/standards-practices\/hdf5\">Meilleures pratiques NASA HDF5<\/a> (NASA EarthData)<\/li>\n<\/ul>\n<hr>\n<p>[^1]&nbsp;: Biblioth\u00e8que du Congr\u00e8s. \"HDF5, format de donn\u00e9es hi\u00e9rarchique, version 5.\" Format Description Document. Disponible via Clarin&nbsp;: <a href=\"https:\/\/standards.clarin.eu\/sis\/views\/view-format.xq?id=fHDF5\">https:\/\/standards.clarin.eu\/sis\/views\/view-format.xq?id=fhdf5<\/a><br> [^2]&nbsp;: le groupe HDF. \"HDF5&nbsp;: une nouvelle g\u00e9n\u00e9ration de HDF.\" <a href=\"https:\/\/www.hdfgroup.org\/solutions\/hdf5\/\">https:\/\/www.hdfgroup.org\/solutions\/hdf5\/<\/a><br> [^3]&nbsp;: groupe HDF. \"Mod\u00e8le de donn\u00e9es HDF5 et structure de fichiers.\" <a href=\"https:\/\/support.hdfgroup.org\/documentation\/hdf5\/latest\/_h5_d_m__u_g.html\">https:\/\/support.hdfgroup.org\/documentation\/hdf5\/latest\/_h5_d_m_u_g.html<\/a><br> [^4]&nbsp;: groupe HDF. \"Attributs HDF5.\" <a href=\"https:\/\/support.hdfgroup.org\/documentation\/hdf5\/latest\/_h5_a__u_g.html\">https:\/\/support.hdfgroup.org\/documentation\/hdf5\/latest\/_h5_a__u_g.html<\/a><br> [^5]&nbsp;: NERSC. \"Introduction aux E\/S scientifiques.\" <a href=\"https:\/\/support.hdfgroup.org\/documentation\/hdf5-docs\/hdf5_topics\/2016_NERSC_Introduction_to_Scientific_IO.pdf\">https:\/\/support.hdfgroup.org\/documentation\/hdf5-docs\/hdf5_topics\/2016_nersc_introduction_to_scientific_io.pdf<\/a><br> [^6]&nbsp;: LRZ. \"Guide des meilleures pratiques - E\/S parall\u00e8les.\" <a href=\"https:\/\/doku.lrz.de\/files\/10746566\/10746567\/11\/1755197969103\/Best-Practice-Guide-Parallel-IO.pdf\">https:\/\/doku.lrz.de\/files\/10746566\/10746567\/11\/175 5197969103\/meilleure-pratique-guide-parall\u00e8le-io.pdf<\/a><br> [^7]&nbsp;: Projet H5PY. \"Documentation H5PY.\" <a href=\"https:\/\/docs.h5py.org\/en\/latest\/\">https:\/\/docs.h5py.org\/en\/latest\/<\/a><br> [^8]&nbsp;: groupe HDF. \"Chunking en HDF5.\" <a href=\"https:\/\/support.hdfgroup.org\/documentation\/hdf5-docs\/advanced_topics\/chunking_in_hdf5.html\">https:\/\/support.hdfgroup.org\/documentation\/hdf5-docs\/advanced_topics\/chunking_in_hdf5.html<\/a><br> [^9]&nbsp;: groupe HDF. \"Obtenir des E\/S hautes performances avec HDF5.\" <a href=\"https:\/\/support.hdfgroup.org\/documentation\/hdf5-docs\/hdf5_topics\/20200206_ECPTutorial-final.pdf\">https:\/\/support.hdfgroup.org\/documentation\/hdf5-docs\/hdf5_topics\/20200206_ecptutorial-final.pdf<\/a><br> [^10]&nbsp;: Forum HDF. \"Des questions sur la taille et le nombre d'un ensemble de donn\u00e9es HDF5.\" <a href=\"https:\/\/forum.hdfgroup.org\/t\/hdf5-dataset-size-and-number-questions\/12215\">https:\/\/forum.hdfgroup.org\/t\/hdf5-dataset-size-and-number-questions\/12215<\/a><br> [^11]&nbsp;: Ambatipudi et al. \"Une comparaison de HDF5, ZARR et NETCDF4 dans les op\u00e9rations d'E\/S courantes.\" arxiv:2207.09503, 2022.<br> [^12]&nbsp;: Forum HDF. \"HDF5 Corruption ou perte de donn\u00e9es possible&nbsp;?\" <a href=\"https:\/\/stackoverflow.com\/questions\/35837243\/hdf5-possible-data-corruption-or-loss\">https:\/\/stackoverflow.com\/questions\/35837243\/hdf5-possible-data-corruption-or-loss<\/a><\/p>\n"},"excerpt":{"rendered":"<p><span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\"> 12<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span>HDF5 est la norme de facto pour le stockage de donn\u00e9es de simulation scientifique \u00e0 grande \u00e9chelle. Sa structure hi\u00e9rarchique, ses capacit\u00e9s d&rsquo;E\/S parall\u00e8les via MPI et sa compression int\u00e9gr\u00e9e le rendent id\u00e9al pour les environnements de calcul haute performance. Cependant, une utilisation inappropri\u00e9e, en particulier de mauvais choix et des mod\u00e8les d&rsquo;acc\u00e8s parall\u00e8les incorrects, [&hellip;]<\/p>\n","protected":false,"raw":""},"author":6,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_locale":"fr_FR","_original_post":"https:\/\/matforge.org\/?p=184","iawp_total_views":3,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1239","post","type-post","status-publish","format-standard","hentry","category-simulation-modeling-projects","fr-FR"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>HDF5 pour les donn\u00e9es de simulation : E\/S parall\u00e8les et stockage \u00e0 long terme - matforge.org<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/matforge.org\/fr\/hdf5-for-simulation-data-parallel-io-long-term-storage\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"HDF5 pour les donn\u00e9es de simulation : E\/S parall\u00e8les et stockage \u00e0 long terme - matforge.org\" \/>\n<meta property=\"og:description\" content=\"Reading Time:  12 minutesHDF5 est la norme de facto pour le stockage de donn\u00e9es de simulation scientifique \u00e0 grande \u00e9chelle. Sa structure hi\u00e9rarchique, ses capacit\u00e9s d&rsquo;E\/S parall\u00e8les via MPI et sa compression int\u00e9gr\u00e9e le rendent id\u00e9al pour les environnements de calcul haute performance. Cependant, une utilisation inappropri\u00e9e, en particulier de mauvais choix et des mod\u00e8les d&rsquo;acc\u00e8s parall\u00e8les incorrects, [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/matforge.org\/fr\/hdf5-for-simulation-data-parallel-io-long-term-storage\/\" \/>\n<meta property=\"og:site_name\" content=\"matforge.org\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-21T14:28:36+00:00\" \/>\n<meta name=\"author\" content=\"steven\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"steven\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"21 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/hdf5-for-simulation-data-parallel-io-long-term-storage\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/hdf5-for-simulation-data-parallel-io-long-term-storage\\\/\"},\"author\":{\"name\":\"steven\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/8f690fb596d657b12994b83caa788f03\"},\"headline\":\"HDF5 pour les donn\u00e9es de simulation : E\\\/S parall\u00e8les et stockage \u00e0 long terme\",\"datePublished\":\"2026-08-21T14:28:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/hdf5-for-simulation-data-parallel-io-long-term-storage\\\/\"},\"wordCount\":3685,\"commentCount\":0,\"articleSection\":[\"Simulation &amp; Projets de mod\u00e9lisation\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/matforge.org\\\/fr\\\/hdf5-for-simulation-data-parallel-io-long-term-storage\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/hdf5-for-simulation-data-parallel-io-long-term-storage\\\/\",\"url\":\"https:\\\/\\\/matforge.org\\\/fr\\\/hdf5-for-simulation-data-parallel-io-long-term-storage\\\/\",\"name\":\"HDF5 pour les donn\u00e9es de simulation : E\\\/S parall\u00e8les et stockage \u00e0 long terme - matforge.org\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#website\"},\"datePublished\":\"2026-08-21T14:28:36+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/8f690fb596d657b12994b83caa788f03\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/hdf5-for-simulation-data-parallel-io-long-term-storage\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/matforge.org\\\/fr\\\/hdf5-for-simulation-data-parallel-io-long-term-storage\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/hdf5-for-simulation-data-parallel-io-long-term-storage\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/matforge.org\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"HDF5 pour les donn\u00e9es de simulation : E\\\/S parall\u00e8les et stockage \u00e0 long terme\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#website\",\"url\":\"https:\\\/\\\/matforge.org\\\/\",\"name\":\"matforge.org\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/matforge.org\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/8f690fb596d657b12994b83caa788f03\",\"name\":\"steven\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d46cfcd83a298f27e8d66bfa035514fefca7652f26bd3ef7402f82b68a41ec0f?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d46cfcd83a298f27e8d66bfa035514fefca7652f26bd3ef7402f82b68a41ec0f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d46cfcd83a298f27e8d66bfa035514fefca7652f26bd3ef7402f82b68a41ec0f?s=96&d=mm&r=g\",\"caption\":\"steven\"},\"url\":\"https:\\\/\\\/matforge.org\\\/author\\\/steven\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"HDF5 pour les donn\u00e9es de simulation : E\/S parall\u00e8les et stockage \u00e0 long terme - matforge.org","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/matforge.org\/fr\/hdf5-for-simulation-data-parallel-io-long-term-storage\/","og_locale":"fr_FR","og_type":"article","og_title":"HDF5 pour les donn\u00e9es de simulation : E\/S parall\u00e8les et stockage \u00e0 long terme - matforge.org","og_description":"Reading Time:  12 minutesHDF5 est la norme de facto pour le stockage de donn\u00e9es de simulation scientifique \u00e0 grande \u00e9chelle. Sa structure hi\u00e9rarchique, ses capacit\u00e9s d&rsquo;E\/S parall\u00e8les via MPI et sa compression int\u00e9gr\u00e9e le rendent id\u00e9al pour les environnements de calcul haute performance. Cependant, une utilisation inappropri\u00e9e, en particulier de mauvais choix et des mod\u00e8les d&rsquo;acc\u00e8s parall\u00e8les incorrects, [&hellip;]","og_url":"https:\/\/matforge.org\/fr\/hdf5-for-simulation-data-parallel-io-long-term-storage\/","og_site_name":"matforge.org","article_published_time":"2026-08-21T14:28:36+00:00","author":"steven","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"steven","Dur\u00e9e de lecture estim\u00e9e":"21 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/matforge.org\/fr\/hdf5-for-simulation-data-parallel-io-long-term-storage\/#article","isPartOf":{"@id":"https:\/\/matforge.org\/fr\/hdf5-for-simulation-data-parallel-io-long-term-storage\/"},"author":{"name":"steven","@id":"https:\/\/matforge.org\/#\/schema\/person\/8f690fb596d657b12994b83caa788f03"},"headline":"HDF5 pour les donn\u00e9es de simulation : E\/S parall\u00e8les et stockage \u00e0 long terme","datePublished":"2026-08-21T14:28:36+00:00","mainEntityOfPage":{"@id":"https:\/\/matforge.org\/fr\/hdf5-for-simulation-data-parallel-io-long-term-storage\/"},"wordCount":3685,"commentCount":0,"articleSection":["Simulation &amp; Projets de mod\u00e9lisation"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/matforge.org\/fr\/hdf5-for-simulation-data-parallel-io-long-term-storage\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/matforge.org\/fr\/hdf5-for-simulation-data-parallel-io-long-term-storage\/","url":"https:\/\/matforge.org\/fr\/hdf5-for-simulation-data-parallel-io-long-term-storage\/","name":"HDF5 pour les donn\u00e9es de simulation : E\/S parall\u00e8les et stockage \u00e0 long terme - matforge.org","isPartOf":{"@id":"https:\/\/matforge.org\/#website"},"datePublished":"2026-08-21T14:28:36+00:00","author":{"@id":"https:\/\/matforge.org\/#\/schema\/person\/8f690fb596d657b12994b83caa788f03"},"breadcrumb":{"@id":"https:\/\/matforge.org\/fr\/hdf5-for-simulation-data-parallel-io-long-term-storage\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/matforge.org\/fr\/hdf5-for-simulation-data-parallel-io-long-term-storage\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/matforge.org\/fr\/hdf5-for-simulation-data-parallel-io-long-term-storage\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/matforge.org\/"},{"@type":"ListItem","position":2,"name":"HDF5 pour les donn\u00e9es de simulation : E\/S parall\u00e8les et stockage \u00e0 long terme"}]},{"@type":"WebSite","@id":"https:\/\/matforge.org\/#website","url":"https:\/\/matforge.org\/","name":"matforge.org","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/matforge.org\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"https:\/\/matforge.org\/#\/schema\/person\/8f690fb596d657b12994b83caa788f03","name":"steven","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/secure.gravatar.com\/avatar\/d46cfcd83a298f27e8d66bfa035514fefca7652f26bd3ef7402f82b68a41ec0f?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/d46cfcd83a298f27e8d66bfa035514fefca7652f26bd3ef7402f82b68a41ec0f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d46cfcd83a298f27e8d66bfa035514fefca7652f26bd3ef7402f82b68a41ec0f?s=96&d=mm&r=g","caption":"steven"},"url":"https:\/\/matforge.org\/author\/steven\/"}]}},"_links":{"self":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1239","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/comments?post=1239"}],"version-history":[{"count":1,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1239\/revisions"}],"predecessor-version":[{"id":1351,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1239\/revisions\/1351"}],"wp:attachment":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/media?parent=1239"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/categories?post=1239"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/tags?post=1239"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}