FR 3016453 A1 20150717 FR 1450267 A 20140114 Procédé et dispositif de stockage de données, procédé et dispositif de décodage de données stockées, et programme d'ordinateur correspondants. 1. Domaine de l'invention Le domaine de l'invention est celui du stockage de données. Plus précisément, l'invention concerne une technique de stockage de données reposant sur l'utilisation d'un code correcteur d'erreurs, et plus spécifiquement sur l'utilisation d'un code en graphe, pour répartir astucieusement les données sur différents supports de stockage. En particulier, l'invention repose sur l'utilisation de codes en graphe creux, dit codes en graphe « sparse ». L'invention trouve notamment des applications pour le stockage de données personnelles, de données au sein d'une entreprise, etc. 2. Art antérieur On s'attache ci-après à décrire une problématique existante dans le domaine des réseaux de stockage distribués centralisés (RSDC). L'invention ne se limite bien sûr pas à ce domaine particulier d'applications, mais présente un intérêt pour toute technique de stockage devant faire face à une problématique proche ou similaire. Un réseau RSDC est classiquement constitué d'un serveur maître, d'un ou plusieurs ensembles de disques durs qui ont chacun un serveur esclave, et de clients. Le serveur maître est chargé de réceptionner les fichiers auprès des clients, de les répartir et de les transmettre aux serveurs esclaves. Un serveur esclave est chargé d'encoder les fichiers et de répartir les octets générés sur les disques durs à sa disposition. En cas de défaillance d'un disque dur, le serveur esclave qui lui est associé est chargé de retrouver les données effacées à partir des parités précédemment calculées. Lors de la lecture des données stockées par un client, le serveur maître transmet aux serveurs esclaves concernés la demande, collecte les données et les transmet au client. La figure 1 illustre un exemple de réseau RSDC comprenant quatre clients 11 à 14, un ensemble de cinq disques durs D1 à D5, et un unique serveur 15 chargé des tâches maître et esclave. Pour protéger les données stockées de la défaillance ou de la perte d'un disque dur notamment, il est nécessaire d'utiliser la réplication (copies multiples de fichiers sur différents disques durs) ou de mettre en oeuvre un codage des données au moyen d'un code correcteur d'erreurs. Un code correcteur d'erreurs est un code permettant à un décodeur de détecter ou de corriger des altérations à la suite de la transmission ou du stockage. Un tel code correcteur d'erreurs introduit de la redondance, permettant de reconstruire des données effacées en cas de défaillance d'un disque dur. En reprenant l'exemple illustré en figure 1, on stocke par exemple un premier ensemble de données source (D1A) d'un premier mot de code sur le disque D1, un deuxième ensemble de données source (D2A) du premier mot de code sur le disque D2, un troisième ensemble de données source (D3A) du premier mot de code sur le disque D3, un quatrième ensemble de données source (D4A) du premier mot de code sur le disque D4, et un ensemble de données de redondance (PA) du premier mot de code sur le disque D5. De la même façon, on stocke par exemple un premier ensemble de données source (D1B) d'un deuxième mot de code sur le disque D1, un deuxième ensemble de données source (D2B) du deuxième mot de code sur le disque D2, un troisième ensemble de données source (D2C) du deuxième mot de code sur le disque D3, un ensemble de données de redondance (PB) du deuxième mot de code sur le disque D5, et un quatrième ensemble de données source (D2D) du deuxième mot de code sur le disque D4, etc. Selon un autre exemple, si l'on considère un réseau comprenant N disques durs, tel que N-M disques durs stockent des données source (encore appelées données utilisateurs) et M disques durs stockent des données de redondance (encore appelé données de parité), et si le code correcteur d'erreurs est un code MDS, le système pourra supporter M défaillances simultanées sans subir de perte de données. Les principaux algorithmes utilisés aujourd'hui pour le stockage de données sur les réseaux RSDC, qui regroupent les protocoles d'allocation des données sur le réseau de stockage ainsi que les calculs d'éventuelles redondances (codage), sont définis sous le terme RAID (en anglais « Redundant Array of Independent Disks », en français « regroupement redondant de disques indépendants »). En informatique, le mot RAID désigne les techniques permettant de répartir des données sur plusieurs disques durs afin d'améliorer soit la tolérance aux pannes, soit la sécurité, soit les performances de l'ensemble, ou une répartition de tout cela. A l'origine, le protocole RAID a été proposé pour composer un disque dur de grande capacité, donc onéreux, à partir de plus petits disques durs peu onéreux, mais moins fiables. Les disques durs connectés en réseau peuvent utiliser différents algorithmes RAID, nommés Niveaux RAID. Chacun de ces niveaux constitue un mode d'utilisation du réseau de disques durs, en fonction : des performances : mesure des temps de reconstruction et du nombre de défaillances simultanées supportées, du coût de stockage : rapport entre le nombre d'octets disponible pour le stockage et le nombre d'octet total dans le réseau, des accès aux disques durs : mesure des temps d'écriture et de lecture en l'absence de défaillances sur le réseau. La constitution des différents réseaux RAID résulte donc d'un compromis entre les différents paramètres que sont la protection devant les défaillances de disques durs, la vitesse de lecture, d'écriture et de reconstruction des données sur le réseau et enfin le coût de stockage. La principale limite de cette technologie est qu'il n'existe pas de niveau RAID permettant la gestion de plusieurs défaillances de disques durs simultanées, avec un coût de stockage faible et peu complexe. Le principal frein technologique vient du code correcteur d'erreurs qui permet de protéger les données stockées. En effet, pour les réseaux de stockage de données, on utilise classiquement un code de type MDS pour « maximum distance séparable » (ou des combinaisons de codes MDS), qui est déterministe. Ainsi, pour chacun des niveaux RAID, le code utilisé est un code MDS. Cependant, un tel code correcteur d'erreurs de type MDS est complexe et difficilement utilisable pour pallier plus de deux défaillances, car il devient relativement lent par rapport aux solutions sans code correcteur d'erreurs. De plus, l'utilisation d'un tel code correcteur d'erreurs de type MDS engendre un coût bien plus élevé en raison du matériel plus performant nécessaire à la réalisation des calculs. 3. Exposé de l'invention L'invention propose une solution nouvelle qui ne présente pas l'ensemble de ces inconvénients de l'art antérieur, sous la forme d'un procédé de stockage de données, mettant en oeuvre un code correcteur d'erreurs définissant un ensemble de variables liées par des contraintes, chaque variable étant associée à des données source et/ou des données de redondance. Selon l'invention, un tel procédé met en oeuvre les étapes suivantes : - détermination des variables composant au moins un cycle d'arrêt du code, - détermination d'un schéma d'allocation des variables, allouant à chaque variable composant un cycle d'arrêt un support de stockage distinct, - répartition des variables ou des données associées aux variables sur les supports de stockage, selon le schéma d'allocation. En répartissant les variables composant un cycle d'arrêt (ou les valeurs/données portées par ces variables) sur des supports de stockage différents, il est possible d'utiliser un décodeur itératif pour retrouver les données source, même en cas de perte ou défaillance d'au moins un des supports de stockage. On diminue ainsi la complexité du décodage. Plus précisément, la détermination des variables composant un cycle d'arrêt permet d'identifier les variables qu'il ne faut pas effacer simultanément pour pouvoir retrouver les données source. La répartition des variables composant un cycle d'arrêt sur des supports de stockage distincts permet donc d'éviter le blocage du décodeur qui pourrait survenir si toutes les variables composant un cycle d'arrêt étaient effacées simultanément en cas de défaillance d'un support de stockage. La notion de cycle d'arrêt (en anglais « stopping set ») est bien connue de l'Homme du Métier, et rappelée notamment dans le document « Modern Coding Theory » de Richardson et Urbanke. Par définition, un tel cycle d'arrêt est un sous-ensemble de l'ensemble des variables, tel que tous les noeuds de contrainte (encore appelé noeuds de parité) qui sont connectés aux variables composant le cycle d'arrêt dans la représentation sous forme d'un graphe de Tanner sont connectés aux variables composant le cycle d'arrêt au moins deux fois. La taille d'un cycle est définie par le nombre de noeuds de contrainte et de variables ainsi connectés. On rappelle également qu'il est connu de l'Homme du Métier de représenter un code correcteur d'erreurs sous la forme d'un graphe de Tanner, sous la forme d'un système d'équations de parité, ou sous la forme d'une équation matricielle avec matrice génératrice ou matrice de contrôle de parité, de façon équivalente. En particulier, les représentations sous forme d'un graphe de Tanner ou d'un système d'équations de parité sont génériques, puisqu'elles proposent un ensemble de combinaison que les variables (données source et/ou données de redondance) doivent respecter. Les représentations sous forme d'une équation matricielle avec matrice génératrice permettent de déterminer des données de redondance à partir de données source choisies parmi les variables. En particulier, on note que les données source ou de redondance peuvent être des bits ou des symboles, et correspondent à des valeurs portées par les variables. Ainsi, le procédé de stockage selon l'invention peut mettre en oeuvre une étape de codage d'au moins un vecteur comprenant les données source, délivrant au moins un vecteur à stocker comprenant les données source et/ou les données de redondance, en appliquant le code correcteur d'erreurs aux données source. L'étape de répartition peut alors allouer les valeurs des variables associées au(x) vecteur(s) à stocker sur la pluralité de supports de stockage. En particulier, un code correcteur d'erreurs selon l'invention est conçu pour corriger les erreurs de type effacement (au sein) d'un support de stockage. Selon une caractéristique particulière de l'invention, le code correcteur d'erreurs est de type code en graphe creux, dit code en graphe « sparse », dont la matrice génératrice ou la matrice de contrôle de parité est une matrice creuse. En d'autres termes, un tel code peut être représenté par une matrice génératrice ou une matrice de contrôle de parité comprenant principalement des éléments nuls. Il s'agit par exemple d'un code de type LDPC ou dérivé d'un code LDPC (en anglais « Low Density Parity Check »). De tels codes en graphe sont peu complexes, et permettent donc de diminuer la complexité de codage et de décodage des données par rapport aux techniques de codage MDS classiquement utilisées dans le domaine du stockage de données. On peut également noter qu'il n'est pas évident d'utiliser les codes en graphe pour le stockage de données, car ces codes ont classiquement un caractère probabiliste et sont donc plutôt utilisés quand une retransmission des données est possible. C'est pourquoi l'art antérieur relatif au stockage de données s'intéresse principalement aux codes MDS. Selon une autre caractéristique spécifique de l'invention, le procédé met en oeuvre une étape préalable de construction du code correcteur d'erreurs, mettant en oeuvre la détermination d'une matrice génératrice ou d'une matrice de contrôle de parité formée à partir d'une répétition d'au moins un motif prédéterminé, dite matrice structurée. Une telle structure cyclique ou quasi-cyclique de la matrice permet de déterminer rapidement les cycles courts, et notamment les cycles d'arrêts, du code correcteur d'erreurs. En particulier, la forme et/ou la taille de la matrice génératrice ou de contrôle de parité peuvent être définies en tenant compte du nombre de supports de stockage disponibles et/ou du nombre d'effacements de variables/ défaillance de supports de stockage autorisés. Ainsi, le nombre de colonnes de la matrice génératrice ou de contrôle de parité doit être égal au nombre de supports de stockage, ou un multiple du nombre de supports de stockage. Selon une autre caractéristique particulière de l'invention, le code correcteur d'erreurs est systématique. De ce fait, le vecteur à stocker, obtenu à l'issu du codage, porte à la fois les données source et des données de redondance. Il est ainsi possible de lire une partie des données stockées (la partie correspondant aux données source) sans réaliser d'opérations mathématiques. Pour ce faire, le code est construit avec une matrice génératrice portant une matrice identité. Selon une première variante de réalisation, l'étape de répartition stocke les données source et/ou de redondance associées/affectées à une variable donnée sur un même support de stockage. De cette façon, les données source ou de redondance de chaque vecteur à stocker sont réparties de façon identique sur les différents supports de stockage, ce qui permet d'optimiser le temps de décodage. Selon une deuxième variante de réalisation, l'étape de répartition stocke les données source et/ou de redondance associées/affectées à une même variable sur des supports de stockage distincts. De cette façon, l'étape de répartition des variables est mise en oeuvre « bande par bande », en déterminant un premier schéma d'allocation pour une première bande correspondant à un premier vecteur à stocker, puis un deuxième schéma d'allocation pour une deuxième bande correspondant à un deuxième vecteur à stocker, un troisième schéma d'allocation pour une troisième bande correspondant à un troisième vecteur à stocker, etc. Avantageusement, on utilise le même schéma d'allocation pour les différentes bandes, mais en travaillant sur des supports de stockage distincts : par exemple les variables vO, vl, v2 sont stockées sur un premier support de stockage pour la première bande, sur un deuxième support de stockage pour la deuxième bande, et sur un troisième support de stockage pour la troisième bande. En particulier, les supports de stockage appartiennent au groupe comprenant : des disques durs, des bandes magnétiques, des mémoires flash, etc. Notamment, de tels supports de stockage peuvent être connectés en réseau. Un tel réseau peut notamment être dynamique et flexible. En cas de modification du réseau, les étapes de construction d'un code correcteur d'erreurs et d'allocation (détermination des cycles d'arrêt, détermination d'un schéma d'allocation, répartition des variables sur les différents supports de stockage) peuvent être mises en oeuvre à nouveau. En cas de diminution du nombre de supports de stockage disponibles, il est également possible d'adapter l'allocation, en supprimant certaines colonnes de la matrice d'allocation, sans refaire les étapes de construction du code, de détermination des cycles d'arrêt et de détermination d'un schéma d'allocation. Selon une caractéristique particulière, tous les supports de stockage ont la même taille. Dans un autre mode de réalisation, l'invention concerne un dispositif de stockage de données utilisant un code correcteur d'erreurs définissant un ensemble de variables liées par des contraintes, chaque variable étant associée à des données source et/ou des données de redondance. Selon l'invention, un tel dispositif comprend : un module de détermination des variables composant au moins un cycle d'arrêt du code, un module de détermination d'un schéma d'allocation des variables, allouant à chaque variable composant un cycle d'arrêt un support de stockage distinct, un module de répartition des variables ou des données associées aux variables sur les supports de stockage, selon le schéma d'allocation. Un tel dispositif de stockage de données est notamment adapté à mettre en oeuvre le procédé de stockage de données décrit précédemment. Il est par exemple intégré dans un serveur (esclave ou maître-esclave) d'un réseau RSDC, chargé de coder les données utilisateurs et de répartir les données codées générées sur les supports de stockage à sa disposition. Un tel dispositif de stockage de données pourra bien sûr comporter les différentes caractéristiques relatives au procédé de stockage de données selon l'invention, qui peuvent être combinées ou prises isolément. Ainsi, les caractéristiques et avantages de ce dispositif de stockage de données sont les mêmes que ceux du procédé de stockage de données. Par conséquent, ils ne sont pas détaillés plus amplement. L'invention concerne par ailleurs un procédé de décodage de données stockées sur une pluralité de supports de stockage, les données ayant été préalablement stockées sur la pluralité de supports de stockage en mettant en oeuvre un code correcteur d'erreurs définissant un ensemble de variables liées par des contraintes, chaque variable étant associée à des données source et/ou des données de redondance, et des étapes de détermination des variables composant au moins un cycle d'arrêt du code, détermination d'un schéma d'allocation des variables, allouant à chaque variable composant un cycle d'arrêt un support de stockage distinct, et répartition des variables ou des données associées aux variables sur les supports de stockage, selon le schéma d'allocation, telles que définies ci-dessus. Selon l'invention, un tel procédé de décodage met en oeuvre une étape de décodage comprenant au moins une itération des étapes suivantes, lorsqu'au moins un des supports de stockage est défaillant : recherche, dans un système d'équations représentatif du code, d'au moins une équation présentant une seule variable associée à une donnée préalablement stockée sur le ou les supports de stockage défaillants, dite variable effacée, reconstruction de la ou des données associées à la ou aux variables effacées, par résolution de la ou des équations, délivrant au moins une donnée reconstruite, mise à jour du système d'équations tenant compte de la ou des données reconstruites. L'invention permet ainsi la mise en oeuvre d'un décodage de type itératif, pour une application dans le domaine du stockage de données. Un tel décodage offre une complexité réduite par rapport aux techniques de décodage classiquement utilisées dans ce domaine. En particulier, un tel procédé de décodage est adapté à décoder des données stockées selon le procédé de stockage décrit ci-dessus. Ainsi, les caractéristiques et avantages de ce procédé de décodage de données stockées sont les mêmes que ceux du procédé de stockage de données. En particulier, si l'étape de répartition stocke les données source ou de redondance associées/affectées à une variable donnée sur un même support de stockage, le procédé de décodage mémorise l'ordre de résolution des équations du système d'équations mise en oeuvre lors de l'étape de décodage d'un premier ensemble de données stockées. Lors de l'étape de décodage d'au moins un deuxième ensemble de données stockées, le procédé de décodage résout les équations du système d'équations selon cet ordre de résolution. On obtient ainsi un gain de temps remarquable sur le décodage des données. Dans un autre mode de réalisation, l'invention concerne un dispositif de décodage de données stockées sur une pluralité de supports de stockage, les données ayant été préalablement stockées sur la pluralité de supports de stockage au moyen d'un dispositif de stockage de données utilisant un code correcteur d'erreurs définissant un ensemble de variables liées par des contraintes, chaque variable étant associée à des données source et/ou des données de redondance, et comprenant un module de détermination des variables composant au moins un cycle d'arrêt du code, un module de détermination d'un schéma d'allocation des variables, allouant à chaque variable composant un cycle d'arrêt un support de stockage distinct, et un module de répartition des variables ou des données associées aux variables sur les supports de stockage, selon le schéma d'allocation, tels que définis précédemment. Selon l'invention, un tel dispositif de décodage comprend un module de décodage comprenant : un module de recherche, dans un système d'équations représentatif du code, d'au moins une équation présentant une seule variable associée à une donnée préalablement stockée sur le ou les supports de stockage défaillants, dite variable effacée, un module de reconstruction de la ou des données associées à la ou aux variables effacées, par résolution de la ou des équations, délivrant au moins une donnée reconstruite, un module de mise à jour du système d'équations tenant compte de la ou des données reconstruites, les modules de recherche, reconstruction et mise à jour étant activés au moins une fois, sous la forme d'au moins une itération, lorsqu'au moins un des supports de stockage est défaillant. Un tel dispositif de décodage de données stockées est notamment adapté à mettre en oeuvre le procédé de décodage de données stockées décrit précédemment. Il est par exemple intégré dans un serveur (esclave ou maître-esclave) d'un réseau RSDC, chargé de lire les données stockées et de reconstruire les données effacées. Un tel dispositif de décodage de données stockées pourra bien sûr comporter les différentes caractéristiques relatives au procédé de décodage de données stockées selon l'invention, qui peuvent être combinées ou prises isolément. Ainsi, les caractéristiques et avantages de ce dispositif de décodage de données stockées sont les mêmes que ceux du procédé de décodage de données stockées. Par conséquent, ils ne sont pas détaillés plus amplement. L'invention concerne par ailleurs un ou plusieurs programmes d'ordinateur, comportant des instructions pour l'exécution des étapes du procédé de stockage de données tel que décrit précédemment, et/ou du procédé de décodage de données stockées tel que décrit précédemment, lorsque le ou les programmes sont exécutés par un ordinateur. Les procédés selon l'invention peuvent donc être mis en oeuvre de diverses manières, notamment sous forme câblée ou sous forme logicielle. 4. Liste des figures D'autres caractéristiques et avantages de l'invention apparaîtront plus clairement à la lecture de la description suivante d'un mode de réalisation particulier, donné à titre de simple exemple illustratif et non limitatif, et des dessins annexés, parmi lesquels : - la figure 1 illustre un exemple de réseau RSDC ; la figure 2 rappelle la notion de graphe de Tanner ; la figure 3 présente les principales étapes mises en oeuvre par un procédé de stockage de données selon au moins un mode de réalisation de l'invention ; les figures 4A et 4B illustrent le principe général de la répartition des variables composant un cycle d'arrêt sur des supports de stockage distincts ; les figures 5A et 5B illustrent un exemple de répartition des variables composant des cycles d'arrêt sur dix disques durs ; la figure 6 présente la répartition des données d'un vecteur à stocker sur dix disques durs obtenue à l'issue de l'opération de stockage ; - les figures 7 et 8 illustrent les répartitions des données de trois vecteurs à stocker sur dix disques durs obtenues à l'issue de l'opération de stockage, selon deux variantes ; la figure 9 présente un autre exemple de matrice d'allocation, sur huit disques durs ; la figure 10 présente les principales étapes mises en oeuvre par un procédé de décodage de données stockées selon au moins un mode de réalisation de l'invention ; - les figures 11 et 12 illustrent respectivement la structure simplifiée d'un dispositif de stockage mettant en oeuvre une technique de stockage de données et la structure simplifiée d'un dispositif de décodage de données stockées selon un mode de réalisation particulier de l'invention. 5. Description d'un mode de réalisation de l'invention 5.1 Principe général Le principe général de l'invention repose sur l'utilisation d'un type particulier de codes correcteurs d'erreurs, les codes en graphe, en particulier de type « sparse », pour les applications de stockage de données. La solution proposée repose sur un algorithme associant code correcteur d'erreurs spécifique et une allocation des données afin d'obtenir un comportement déterministe des codes en graphe. Ceci permet d'envisager l'utilisation de codes peu complexes pour les systèmes de stockage de données. On note que cette approche n'est pas évidente pour l'Homme du Métier, pour lequel les codes en graphe peuvent être utilisés pour une application dans laquelle une retransmission des données est possible, du fait du caractère probabiliste de ces codes, et non pour une application de stockage des données. La structure particulière du code utilisé selon l'invention, combinée à une répartition astucieuse des variables associées à ce code, permet d'obtenir un comportement déterministe des codes en graphe. On peut ainsi, selon l'invention, utiliser des codes en graphe, qui présentent une faible complexité d'encodage et de décodage (itératif), pour le stockage de données. En particulier, le modèle de stockage de données proposé peut être simulé par un canal à effacement par bloc (en anglais BLEC pour « Bloc Erasure Channel ») avec une taille de mot de code variable. On note d_max la protection maximale du réseau, i.e. le nombre maximal de supports de stockage effacés que le réseau peut supporter. Le modèle d'effacement est alors : - perte d'un support de stockage avec une probabilité P1 ; - perte de deux supports de stockage, avec une probabilité P2 P2>...>Pd_max. Ceci signifie que l'on considère que la probabilité d'effacement d'un support de données est dépendante de l'état du reste du réseau (i.e. de l'ensemble des supports de stockage). De plus, Pd_max+ A = 0 avec A un entier tel que A > 0 . Ceci signifie que les données stockées sur plus de d_max supports de stockage ne peuvent être effacées simultanément. On note également que pour le stockage de données, aucune retransmission n'est possible. Il faut donc garantir une protection contre toutes les défaillances de taille d_max. De plus, la garantie de la reconstruction doit être réalisée en minimisant le coût de stockage, i.e. le nombre de symboles de redondance doit tendre vers d_max. En répartissant les variables composant un cycle d'arrêt (ou les valeurs/données portées par ces variables) sur des supports de stockage différents, il est ainsi possible d'utiliser un décodeur itératif pour retrouver les données source, même en cas de perte ou défaillance de d_max supports de stockage. On assure ainsi le décodage tout en bénéficiant de la faible complexité du décodage itératif. 5.2 Rappels sur les codes en graphe Les codes en graphe « sparse » regroupent différentes familles de codes correcteurs d'erreurs. La première famille de ces codes, notée LDPC, a été introduite par Robert Gallager. Le nom de ces codes vient du fait que, contrairement aux codes MDS par exemple, la matrice génératrice utilisée (ou la matrice de contrôle de parité) comprend beaucoup d'éléments nuls, ce qui signifie que le calcul des bits de parité devient moins complexe car il nécessite moins d'opérations. Le terme « code en graphe » vient de la représentation en graphe, généralement bipartite, que Tanner a proposé pour ces codes. Cette représentation s'est généralisée pour les familles dérivées des codes LDPC, et le terme code en graphe regroupe aujourd'hui ces nombreux codes aux complexités d'encodage et/ou de décodage faibles. A titre d'exemple, la figure 2 illustre un code correcteur d'erreur sous sa représentation sous forme de graphe, où les ronds à gauche du graphe correspondent aux variables v/ à v5 (qui peuvent être de type données source ou données de redondance), et les carrés à droite correspondent aux contraintes cl à c3. Comme déjà indiqué, un tel code peut, de façon équivalente, être représenté par un système d'équations ou par une matrice génératrice ou une matrice de contrôle de parité. Ainsi, le code représenté en figure 2 peut également s'exprimer sous la forme du système d'équations suivant : v1 + v2 + v3 + v4 = 0 vl + v3 + v5 = 0 v2 + v4 + v5 =0 ou de la matrice de contrôle de parité suivante : H = 1 1 1 1 0 1 0 1 0 1 0 1 0 1 1 où les colonnes de la matrice de contrôle de parité représentent les différentes variables v/ à v5 et les lignes de la matrice de contrôle de parité les différentes contraintes cl à c3 que doivent respecter les variables v/ à v5. Les codes LDPC, et leurs familles dérivées, peuvent atteindre ou se rapprocher de la borne de Shannon, tout en gardant une complexité d'encodage et de décodage faible grâce à l'utilisation d'un décodeur itératif, par exemple de type « Belief Propagation » (décodeur de propagation de croyances). Cette diminution de la complexité a un principal inconvénient : les codes en graphe ne sont pas MDS avec un décodeur itératif. Ceci signifie, dans le cas du stockage de données, qu'il est nécessaire d'avoir Y disques de redondance pour supporter X disques durs défaillants dans le réseau, avec Y>X. On présente selon l'invention un nouvel algorithme combinant utilisation d'un code correcteur d'erreurs structuré/allocation des donnés afin d'obtenir un fonctionnement MDS des codes en graphe dans un système de stockage de données, tout en gardant un décodeur itératif. 5.3 Stockage de données On présente ci-après, en relation avec la figure 3, les principales étapes mises en oeuvre par un procédé de stockage de données selon l'invention. Un tel procédé peut mettre en oeuvre un code correcteur d'erreurs définissant un ensemble de variables liées par des contraintes et pouvant donc être représenté par un graphe. En particulier, un tel un code en graphe est de type sparse. Un tel procédé peut éventuellement mettre en oeuvre une étape préalable de construction 30 du code, par exemple à l'initialisation de l'algorithme de stockage. Au cours d'une première étape 31, on détermine les variables composant au moins un cycle d'arrêt du code, encore appelé « stopping set » et noté SS. Au cours d'une deuxième étape 32, on détermine un schéma d'allocation des variables, allouant à chaque variable composant un cycle d'arrêt un support de stockage distinct. Au cours d'une troisième étape 33, on répartit les variables, ou les données associées à ces variables, sur les supports de stockage, selon le schéma d'allocation. On distribue donc chaque variable composant un cycle d'arrêt (ou donnée associée) sur un support de stockage distinct. En particulier, une étape de codage des données source peut être mise en oeuvre préalablement à l'étape de répartition. Une telle étape de codage permet de construire, à partir d'au moins un vecteur de données source, au moins un vecteur de données codées à stocker. Les données codées, associées aux variables, peuvent alors être stockées en suivant le schéma d'allocation. Comme déjà indiqué, les codes en graphe sont des codes non MDS lorsque l'on utilise un décodeur itératif. La principale raison est la présence de cycles d'arrêt au sein de ces codes en graphe, qui correspondent à des cycles courts. Le problème des cycles courts peut être présenté par un système d'équations dans le cadre du stockage de données, où les seules erreurs considérées possibles sont l'effacement d'une partie des données. Lorsque tous les éléments d'un cycle sont effacés, on obtient un système où plusieurs équations possèdent plus de deux inconnues, ce qui rend la fin du décodage impossible. On cherche donc selon l'invention à répartir les différentes variables composant un cycle court, et plus spécifiquement un cycle d'arrêt, sur différents supports de stockage. L'invention propose donc d'utiliser un code très structuré où les cycles sont facilement identifiables (généralement ce type de codes possède un nombre important de cycles et n'est pas considéré comme performant) et d'allouer astucieusement les variables pour que toutes les variables d'un cycle d'arrêt ne puissent pas être effacées en même temps. On rappelle que la notion de variable est définie au niveau de la construction même du code. Un code correcteur d'erreur défini ainsi un ensemble de combinaisons que les variables doivent respecter. Ces variables peuvent prendre différentes valeurs, correspondant à des données source ou des données de redondance d'un « mot de code », encore appelé vecteur à stocker. En particulier, si l'on considère un réseau de stockage de données comprenant N disques durs, tels que l'ensemble des données utilisateurs peut être réparti sur K disques, l'étape de construction 30 du code construit un code structuré de paramètres n = aN , k = al 2(N - K), où s(H) est la distance d'arrêt (en anglais « stopping distance ») de la matrice de contrôle de parité H, i.e. la plus petite taille de cycle d'arrêt. Un cycle d'arrêt de taille s(H) est nommé cycle d'arrêt minimal (en anglais « minimum stopping set »). La condition s(H)> 2(N-K) permet d'assurer une répartition des données associées à des variables composant un cycle d'arrêt sur plus de N-K disques. L'utilisation d'un code structuré permet de faciliter la mise en oeuvre de l'étape de détermination des variables composant un cycle d'arrêt. On décrit ci-après un exemple de mise en oeuvre de l'invention, pour le stockage de données sur un ensemble de dix disques durs supportant les défaillances de deux disques durs. Comme indiqué ci-dessus, le code choisi doit permettre de déterminer rapidement les cycles. On utilise pour cela une structure de type quasi cyclique. On rappelle que cette structure permet d'étendre à l'infini une même structure matricielle. Ainsi, si on est capable de déterminer les cycles sur une petite structure donnée (de l'ordre d'une centaine de variables), on retrouvera régulièrement les même cycles en étendant cette structure. On sera alors capable de déterminer les cycles d'arrêt qui empêchent le décodage itératif de réussir. Par exemple, on utilise un code LDGM permettant en encodage très rapide des données. Pour ce faire, au cours de l'étape de construction du code correcteur d'erreurs, on construit une matrice de contrôle de parité comprenant dix lignes et cinquante colonnes, ce qui signifie que l'on peut stocker cinq octets par secteur de disque dur. Une telle matrice de contrôle de parité H est formée d'une matrice identité de taille 10x10, notée Id10x10, et d'une répétition de quatre motifs colonne par colonne (11, 101, 1001, 10001) : H [ I dioxio P ] avec 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 O 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 O 0 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 O 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 O 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 O 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 O 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 O 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 O 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 Les colonnes de la matrice de contrôle de parité H représentent les différentes variables v0 à v49 du code correcteur d'erreur, et les lignes de la matrice de contrôle de parité les différentes contraintes c0 à c9 que doivent respecter les variables v0 à v49. Par exemple, on peut définir les équations suivantes : v0 = v10 + v19 + v20 + v28 + v30 + v37 + v40 + v46 v1= v10+v11+v21+v29+v31+v38+v41+v47 v2= v11+v12+v20+v22+v32+v39+v42+v48 v3= v12+v13+v21+v23+v30+v33+v43+v49 v4 = v13+ v14 + v22+ v24 + v31+ v34 + v40 + v44 v5 =v14+v15+v23+v25+v32+v35+v41+v45 v6 = v15+v16+v24+v26+v33+v36+v42+v46 v7 = v16+ v17 + v25+ v27 + v34 + v37 + v43+ v47 v8 = v17 + v18 + v26+ v28 + v35 + v38 + v44 + v48 v9 = v18+v19+v27+v29+v36+v39+v45+v49 où l'opérateur « + » est un « ou exclusif », encore noté XOR. La matrice génératrice G correspondante comprend cinquante lignes et quarante colonnes : G = Id 40x40 P [ avec P la partie de la matrice génératrice utilisée pour calculer les données de 20 redondance. P= Ainsi, si l'on considère un vecteur de données U comprenant des données source, tel que U = (u0,u1,u2,....,u39), alors le vecteur de données à stocker R, comprenant des données source et des données de redondance, tel que R = (r0,r1,r2,....,r49) , est obtenu de la façon suivante : R =GxU où r0 à r39 correspondent à des données source, et r40 à r49 à des données de redondance. On remarque dans cet exemple que la matrice de contrôle de parité H et la matrice génératrice G comprennent toutes les deux la matrice P. Ceci est une propriété des codes LDGM, qui utilisent une même matrice pour le codage et le décodage des données. Une fois le code correcteur d'erreurs ainsi construit, il est possible d'identifier les cycles d'arrêt de ce code, par exemple en utilisant l'algorithme décrit dans les documents « Finding small stopping sets in the Tanner graphs of LDPC codes » de Gerd Richter, « A probabilistic algorithm for finding the minimum-size stopping sets of LDPC codes » de M. Hirotomo et al. ou « Stopping set distribution of LDPC code ensembles » de Orlitsky et al.. En particulier, la matrice de contrôle de parité H étant très structurée, il est possible de déterminer facilement les cycles courts, et notamment les cycles d'arrêt. On identifie ainsi l'ensemble des variables formant un cycle d'arrêt de taille 6, l'ensemble des variables formant un cycle d'arrêt de taille 8, etc. On distribue ensuite chaque variable d'un cycle d'arrêt sur des disques durs distincts. Les figures 4A et 4B illustrent de façon simplifiée l'idée de répartir les variables composant un cycle d'arrêt sur un nombre de disques suffisamment important pour rendre impossible la suppression de toutes les variables d'un cycle d'arrêt simultanément. Dans cet exemple, les noeuds hachurés représentent un cycle d'arrêt. La taille de ce cycle, définie par le nombre de noeuds composant le cycle (i.e. le nombre de noeud de variables et noeuds de contrainte), est égale à 6. Si les variables A, C, E composant ce cycle d'arrêt sont effacées simultanément, le décodeur aura à résoudre un système comprenant trois équations à deux inconnues sans possibilité de déterminer ces inconnues. Si l'on considère que l'on cherche à se protéger de la perte de deux disques, on va répartir les trois variables A, C, E composant ce cycle d'arrêt sur trois disques différents D1, D2, D3 pour rendre ce cas d'effacement impossible. En reprenant l'exemple ci-dessus dans lequel la matrice de contrôle de parité H est définie par H=[ Id irl P , et en considérant que les colonnes de la matrice de contrôle de parité ioxio représentent les différentes variables v0 à v49 et les lignes de la matrice de contrôle de parité les différentes contraintes c0 à c9 que doivent respecter les variables, on identifie des cycles d'arrêt de taille 6, comprenant : les variables v10, v11 et v20, les variables v10, v21 et v30, les variables v11, v12 et v21, les variables v11, v22, v31, les variables v12, v13, v22, les variables v12, v23, v32, etc. Plus précisément, on constate que la matrice de contrôle de parité H ne possède pas de cycles de taille 4. On constate également que deux variables associées à un même motif dans la matrice de contrôle de parité H ('1' pour les variables v0 à v9 de degré 1, '11' pour les variables v10 à v19 de degré 2, '101' pour les variables v20 à v29 de degré 2, '1001' pour les variables v30 à v39 de degré 2 et '10001' pour les variables v40 à v49 de degré 2) font généralement partie d'un cycle de taille 6 (composé de 3 variables). On décide donc de ne pas stocker sur le même support deux variables associées à un même motif. De plus, on constate que si toutes les variables situées allouées à un même support de stockage n'interviennent pas plus de une fois sur l'ensemble des lignes, alors en respectant le point précédent, on ne pourra pas tomber dans un cycle de taille 6 lors de l'effacement de deux supports de stockage. Le schéma d'allocation peut donc être construit de façon itérative en respectant les règles ci-dessus. Par exemple, pour le premier disque Dl : a) on prend la première variable de degré 1, soit la variable v0 ; b) on prend ensuite la première variable de degré 2 selon le motif '11', avec un élément nul sur la même équation que la variable choisie précédemment, soit la variable v11 ; c) on prend la première variable de degré 2 selon le motif '101' avec des éléments non nuls sur des équations « libres », soit la variable v23 ; d) on prend la première variable de degré 2 selon le motif '1001' avec des éléments non nuls sur des équations « libres », soit la variable v34 ; e) on constate un problème pour la sélection de la première variable de degré 2 selon le motif '10001', car elle ne permet pas de respecter les règles définies ci-dessus. On supprime donc la sélection effectuée au d, soit la variable v34 ; f) on prend la première variable de degré 2 selon le motif '10001' avec des éléments non nuls sur des équations « libres », soit la variable v44 ; g) on prend la première variable de degré 2 selon le motif '1001' avec des éléments non nuls sur des équations « libres », soit la variable v36. On procède ainsi de suite pour les différentes variables, puis on opère le même principe sur les autres disques. Il est également possible d'utiliser un algorithme connu pour la détermination des cycles courts, comme par exemple celui proposé dans le document « Finding small stopping sets in the Tanner graphs of LDPC codes » de Gerd Richter précité. Une fois ces cycles d'arrêt identifiés, on répartit les variables de chaque cycle d'arrêt sur des disques distincts. Les figures 5A et 5B présentent deux schémas d'allocation équivalents illustrant un exemple de répartition de ces variables sur dix disques D1 à D10, en travaillant avec cinq octets par disque selon l'invention. Plus précisément, la figure 5A présente le résultat de la répartition des variables sur les dix disques, et la figure 5B illustre une matrice d'allocation permettant d'obtenir ce résultat. Par exemple, on alloue les variables vO, v11, v23, v44 et v36 (ou les valeurs portées par ces variables) au disque D1, les variables v2, v13, v25, v46 et v38 (ou les valeurs portées par ces variables) au disque D2, les variables v4, v15, v27, v48 et v30 (ou les valeurs portées par ces variables) au disque D3, les variables v6, v17, v29, v40 et v32 (ou les valeurs portées par ces variables) au disque D4, les variables v8, v19, v21, v42 et v34 (ou les valeurs portées par ces variables) au disque D5, les variables vl, v12, v24, v45 et v37 (ou les valeurs portées par ces variables) au disque D6, les variables v3, v14, v26, v47 et v39 (ou les valeurs portées par ces variables) au disque D7, les variables v5, v16, v28, v49 et v31 (ou les valeurs portées par ces variables) au disque D8, les variables v7, v18, v20, v41 et v33 (ou les valeurs portées par ces variables) au disque D9, les variables v9, v10, v22, v43 et v35 (ou les valeurs portées par ces variables) au disque D10. On note que l'ordre d'allocation sur les disques n'a pas d'importance. En d'autres termes, les variables vO, v11, v23, v44 et v36 pourraient indifféremment être allouées au disque D2 plutôt qu'au disque Dl. En d'autres termes, l'allocation proposée selon l'invention permet de répartir les variables de façon que chaque disque stocke un ensemble de variables qui n'intervient que dans neuf équations différentes, ce qui signifie que l'ensemble des variables d'un même disque n'intervient pas sur une ligne de la matrice de contrôle de parité. Comme déjà indiqué, la matrice de contrôle de parité, très structurée, possède de nombreux cycles courts, fermés. L'allocation permet donc de distribuer les variables de sorte que les variables intervenant dans des cycles d'arrêt soient stockées sur plus de deux disques. Par exemple, les variables v26, v42 et v48, et les variables v14, v22, v32, forment deux cycles qui pourraient bloquer le décodage itératif en cas de défaillance d'un disque stockant ces variables. On répartit donc selon l'invention ces variables sur trois disques différents (D7, D5 et D3 pour le premier cycle d'arrêt, et D7, D10 et D4 pour le deuxième cycle d'arrêt). Comme le système est construit pour supporter deux pertes, on considère que l'effacement simultané des trois variables composant ces cycles d'arrêt est impossible. Cette allocation assure donc la reconstruction des données pour chacun des effacements de taille 2 (et bien sûr de taille 1). On présente ci-après un exemple de stockage de données mettant en oeuvre le procédé de stockage de données selon au moins un mode de réalisation de l'invention. Comme indiqué précédemment, on peut obtenir la matrice génératrice G à partir de la matrice de contrôle de parité H. Cette matrice génératrice G permet, à partir d'un vecteur de données source U, d'obtenir un vecteur de données à stocker R. Par exemple, le code construit selon l'invention est systématique. De ce fait, les valeurs du vecteur de données source U se retrouvent à l'identique dans le vecteur de données à stocker R, qui comprend donc des données source et des données de redondance. On considère par exemple un vecteur de données source U1 portant les symboles suivants : U1 = [5,120,78,56,98,9,3,25,156,230,34,7,67,83,54,93,175,3,28,186,220,54,7,24, 54,75, 93,186,237,200,46,116,1,87,47,26,74,249,165,23] En appliquant la matrice génératrice G à ce vecteur de données source U1, i.e. en appliquant le code correcteur d'erreurs au vecteur de données source U1, on obtient un vecteur de données à stocker R1 portant les symboles suivants : R1=[5,120,78,56,98,9,3,25,156,230,34,7,67,83,54,93,175,3,28,186,220,54,7, 24,54,75, 93,186,237,200,46,116,1,87,47,26,74,249,165,23,223,150,60,166,46,71,157, 102,26,91] On peut appliquer ces valeurs aux variables v0 à v49 définies précédemment, par exemple comme proposé ci-après : v0=223 v10=5 v20=34 v30=220 v40=46 v1=150 v11=120 v21=7 v31=54 v41=116 v2=60 v12=78 v22=67 v32=7 v42=1 v3=166 v13=56 v23=83 v33=24 v43=87 v4=46 v14=98 v24=54 v34=54 v44=47 v5=71 v15=9 v25=93 v35=75 v45=26 v6=157 v16=3 v26=175 v36=93 v46=74 v7=102 v17=25 v27=3 v37=186 v47=249 v8=26 v18=156 v28=28 v38=237 v48=165 v9=91 v19=230 v29=186 v39=200 v49=23 On peut ainsi réaliser le stockage des symboles du vecteur de données à stocker R1 sur les dix disques durs, en respectant le schéma d'allocation proposé pour les variables v0 à v49. La figure 6 illustre le résultat de l'opération de stockage. Les opérations précédentes peuvent être réitérées pour les vecteurs de données source suivants. Par exemple, en appliquant la matrice génératrice G à un vecteur de données source U2, i.e. en appliquant le code correcteur d'erreurs au vecteur de données source U2, tel que : U2 =[1,46,58,245,65,165,7,8,40,12,54,89,94,243,153,210,196,154,220,3,52,16, 39,52,37,53, 96,71,9,34,2,68,198,2,37,236,178,14,97,87] on obtient un vecteur de données à stocker R2 portant les symboles suivants : R2 = [1,46,58,245,65,165,7,8,40,12,54,89,94,243,153,210,196,154,220,3,52,16,39, 52,37,53, 96,71,9,34,2,68,198,2,37,236,178,14,97,87,36,38,22,48,97,127,223,41,64,68] En appliquant la matrice génératrice G à un vecteur de données source U3, tel que : U3 = [65,78,42,243,156,23,187,123,154,67,90,36,71,1,98,0,32,74,213,5,69,15,67, 39,125,8, 39,2,15,69,176,216,176,3,74,92,42,189,38,4] on obtient un vecteur de données à stocker R3 portant les symboles suivants : R3 = [65,78,42,243,156,23,187,123,154,67,90,36,71,1,98,0,32,74,213,5,69,15,67, 39,125,8, 39,2,15,69,176,216,176,3,74,92,42,189,38,4,80,75,233,153,194,69,116,75, 127,172] On peut appliquer ces valeurs aux variables v0 à v49 définies précédemment. Par exemple, les variables v0 à v49 définies précédemment peuvent prendre successivement les valeurs suivantes (où pour chaque cellule, les trois nombres correspondent respectivement à un symbole du vecteur à stocker R1, à un symbole du vecteur à stocker R2, et à un symbole du vecteur à stocker R3) : v0=223 ; 36 ; 80 v10=5 ; 1 ; 65 v20=34 ; 54 ; 90 v30=220 ; 52 ; 69 v40=46 ; 2 ; 175 v1=150 ; 38 ; 75; v11=120 ; 46 ; 78 v21=7 ; 89 ; 36 v31=54 ; 16 ; 15 v41=116 ; 68 ; 216 v2=60 ; 222 ; 233 v12=78 ; 58 ; 42 v22=67 ; 94 ; 71 v32=7 ; 39 ; 67 v42=1 ; 19 ; 176 v3=166 ; 48 ; 153 v13=56 ; 245 ; 243 v23=83 ; 243 ; 1 v33=24 ; 52 ; 39 v43=87 ; 2 ; 3 v4=46 ; 97 ; 194 v14=98 ; 65 ; 156 v24=54 ; 153 ; 98 v34=54 ; 37 ; 125 v44=47 ; 37 ; 74 v5=71 ; 127 ; 69 v15=9 ; 165 ; 23 v25=93 ; 210 ; 0 v35=75 ; 53 ; 8 v45=26 ; 236 ; 92 v6=157 ; 223 ; 116 v16=3 ; 7 ; 187 v26=175 ; 196 ; 32 v36=93 ; 96 ; 39 v46=74 ; 178 ; 42 v7=102 ; 41; 75 v17=25 ; 8 ; 123 v27=3 ; 154 ; 74 v37=186 ; 71 ; 2 v47=249 ; 14 ; 189 v8=26 ; 64 ; 127 v18=156 ; 40 ; 154 v28=28 ; 220 ; 213 v38=237 ; 9 ; 15 v48=165 ; 97 ; 38 v9=91 ; 68 ; 172 v19=230 ; 12 ; 67 v29=186 ; 3 ; 5 v39=200 ; 34 ; 69 v49=23 ; 87 ; 4 Selon une première variante, illustrée en figure 7, l'étape de répartition stocke les données source ou de redondance affectées à une variable donnée sur un même support de stockage. Ainsi, les valeurs 223, 36 et 80 affectées à la variable v0 sont stockées sur le disque Dl. Selon une deuxième variante, illustrée en figure 8, l'étape de répartition stocke les données source ou de redondance affectées à une variable donnée sur des supports de stockage distincts. Ainsi, les valeurs 223, 36 et 80 affectées à la variable v0 sont respectivement stockées sur le disque D1, le disque D2 et le disque D3. On considère pour ce faire que les disques peuvent être décomposés en bande (en anglais « stripe »), chaque bande étant associée à un vecteur à stocker. Le premier vecteur à stocker R1 est stocké comme décrit ci-dessus. Le deuxième vecteur à stocker R2 est stocké comme décrit ci-dessus, avec un décalage d'un disque par rapport au premier vecteur à stocker R1. Le troisième vecteur à stocker R3 est stocké comme décrit ci-dessus, avec un décalage d'un disque par rapport au deuxième vecteur à stocker R2. L'étape de répartition des variables est donc mise en oeuvre « bande par bande », en déterminant un premier schéma d'allocation pour la première bande, puis un deuxième schéma d'allocation pour la deuxième bande, un troisième schéma d'allocation pour la troisième bande, etc. Selon l'exemple illustré en figure 8, on utilise le même schéma d'allocation avec un décalage d'un disque dur. On répartit de cette façon les données de redondance (parité) sur les différents disques, comme proposé dans le niveau 5 de l'algorithme RAID (« Parity striping »). A titre purement illustratif, la figure 9 présente un autre exemple de répartition des variables sur huit disques D1 à D8, supportant la défaillance de deux disques durs. Ce schéma ou matrice d'allocation correspond à une matrice LDPC triangulaire inférieure, et est obtenu en supprimant certaines colonnes de la matrice d'allocation illustrée en figure 5B. Selon cet exemple, les complexités moyennes d'encodage et de décodage sont de 6,2 XORs par octets. 5.4 Décodage des données On présente désormais, en relation avec la figure 10, les principales étapes mises en oeuvre par un procédé de décodage de données selon l'invention, permettant de décoder des données stockées selon un mode de réalisation du procédé de stockage de données décrit ci-dessus. Selon l'invention, un tel procédé de décodage permet de retrouver les données source, même en cas d'effacement d'un ou plusieurs supports de stockage. Pour ce faire, un tel procédé de décodage met en oeuvre une étape de décodage 100 comprenant au moins une itération des étapes suivantes, lorsqu'au moins un des supports de stockage est défaillant : recherche 101, dans un système d'équations représentatif du code, d'au moins une équation présentant une seule variable associée à une donnée (source et/ou de redondance) préalablement stockée sur le ou les supports de stockage défaillants, dite variable effacée. Cette étape permet notamment d'identifier les équations à une seule inconnue du système d'équations, que l'on peut facilement résoudre. reconstruction 102 de la ou des données associées à la ou aux variables effacées, par résolution de la ou des équations, délivrant au moins une donnée reconstruite, mise à jour 103 du système d'équations tenant compte de la ou des données reconstruites. Cette étape permet notamment de mettre à jour les équations dans lesquelles interviennent la ou les variables associées aux données reconstruites à l'étape 102. Ces étapes de recherche 101, reconstruction 102 et mise à jour du système d'équations 103 sont mises en oeuvre tant que toutes les variables ne sont pas déterminées. En particulier, l'étape de mise à jour peut être mise à oeuvre à chaque fois qu'une donnée est reconstruite. Une étape de décodage 100 est mise en oeuvre pour le décodage de chaque vecteur R stocké, c'est-à-dire bande par bande. On présente plus précisément un exemple de mise en oeuvre de l'invention, pour le décodage de données stockées sur un ensemble de dix disques durs comme illustré en figure 7, supportant les défaillances de deux disques durs. On suppose que les disques D1 et D2 sont défaillants. On dispose donc uniquement des disques D3 à D10 pour reconstruire les données source (données utilisateurs). On applique l'étape de décodage décrite ci-dessus à la première bande. On recherche tout d'abord, dans le système d'équations représentatif du code, au cours d'une première itération, une équation ou plusieurs équations présentant une seule variable associée à une donnée préalablement stockée sur le ou les supports de stockage défaillants, dites variables effacées. Cette étape permet notamment d'identifier les équations à une seule inconnue du système d'équations, que l'on peut facilement résoudre. La première équation, qui correspond à la première ligne de la matrice de contrôle de parité, i.e. v0+ v10 + v19 + v20 + v28 + v30+ v37 + v40 + v46 = 0 , comprend deux inconnues puisque les données associées aux variables v0 et v46, qui étaient stockées sur les disques D1 et D2, ont été effacées. La deuxième équation, qui correspond à la deuxième ligne de la matrice de contrôle de parité, i.e. v1 + v10+ v11+ v21+ v29 + v31+ v38 + v41+ v47 = 0, comprend deux inconnues puisque les données associées aux variables v11 et v38, qui étaient stockées sur les disques D1 et D2, ont été effacées. Il en est de même pour : la troisième équation : v2+ v11+ v12+ v20+ v22+ v32+ v39+ v42+ v48 = 0 la quatrième équation : v3+ v12+ v13+ v21+ v23+ v30+ v33+ v43+ v49 = 0 la cinquième équation : v4 + v13+ v14 +v22+ v24 + v31 + v34 +v40+ v44 = 0 la sixième équation : v5+ v14 + v15+ v23+ v25+ v32+ v35+ v41+ v45 = 0 la septième équation : v6+ v15+ v16+ v24 + v26+ v33+ v36+ v42+ v46 = 0. En revanche, la huitième équation v7+ v16+ v17+ v25+ v27+ v34 + v37+ v43+ v47 = 0 comprend une seule inconnue, la donnée associée à la variable v25. On peut donc déterminer sa valeur en résolvant la huitième équation : v25 = v7+ v16+ v17+ v27+ v34+ v37+ v43+ v47 v25=102+3+25+3+54+186+87+249 v25 =93 La neuvième équation, i.e. v8 + v17+ v18+ v26+ v28+ v35+ v38+ v44 + v48 = 0, comprend deux inconnues. En revanche, la dixième équation v9+ v18+ v19+ v27+ v29+ v36+ v39+ v45+ v49 = 0 comprend une seule inconnue, la donnée associée à la variable v36. On peut donc déterminer sa valeur en résolvant la dixième équation : v36 = v9+ v18+ v19+ v27+ v29+ v39+ v45+ v49 v36=91+156+230+3+186+200+26+23 v36 = 93 Le système d'équations peut alors être mis à jour en tenant compte des valeurs des variables v25 et v36 reconstruite. Cette étape permet notamment de mettre à jour les équations dans lesquelles interviennent les variables v25 et v36. On recherche ensuite, dans le système d'équations représentatif du code, au cours d'une deuxième itération, une équation ou plusieurs équations présentant une seule variable effacée. La première équation comprend toujours deux inconnues. Il en est de même pour les deuxième, troisième, quatrième, cinquième et neuvième équations. En revanche, la sixième équation comprend une seule inconnue, la donnée associée à la variable v23. On peut donc déterminer sa valeur en résolvant la sixième équation : v23 = v5+ v14 + v15+ v25+ v32+ v35+ v41+ v45 v23=71+98+9+93+7+75+116+26 v23= 83 De la même façon, la septième équation comprend une seule inconnue, la donnée associée à la variable v46. En résolvant la septième équation, on obtient v46=74. Le système d'équations peut alors être mis à jour en tenant compte des valeurs des variables v23 et v46 reconstruite. En procédant de manière similaire, on peut déterminer les valeurs des variables v0 (v0=223), v13 (v13=56), v44 (v44=47) et v38 (v38=237) au cours d'une troisième itération, puis les valeurs des variables v11 (v11=120) et v2 (v2=60) au cours d'une quatrième itération. Le système d'équation est alors résolu, ce qui signifie que la première bande, correspondant au premier vecteur stocké, peut être décodée, et les donnés source restituées, même après effacement de deux disques durs. Comme indiqué précédemment, l'étape de décodage 100 peut être mise en oeuvre bande par bande. Si l'on considère que l'étape de répartition mise en oeuvre lors du stockage de données stocke des données source ou de redondance affectées à une variable donnée sur le même support de stockage, selon la première variante illustrée en figure 7, le procédé de décodage peut mémoriser l'ordre de résolution des équations du système d'équations mis en oeuvre lors de l'étape de décodage de la première bande. De cette façon, lors de l'étape de décodage de la deuxième bande et de la troisième bande, le procédé de décodage connaît l'ordre de résolution optimal des équations, ce qui confère un gain de temps remarquable au décodage. Plus précisément, dans l'exemple illustré en figure 7, on a réalisé l'allocation de sorte que les valeurs du deuxième vecteur à stocker R2 soient positionnées sur le même disque que les valeurs du premier vecteur à stocker R1 correspondant à la même position dans l'équation. On a donc de nouveau les mêmes inconnues dans la matrice de contrôle de parité H, et par suite le même système d'équations à résoudre. Comme on connaît l'ordre dans lequel le système d'équations a été résolu pour la première bande, on applique ce même ordre de résolution pour résoudre le système d'équations de la deuxième bande. Ainsi, on commence par résoudre la huitième équation (v25=210), puis la dixième équation (v36=96), puis la sixième équation (v23=243), puis la septième équation (v46=178), puis la première équation( v0=36), puis la quatrième équation (v13=245), puis la cinquième équation (v44=37), puis la neuvième équation (v38=9), puis la deuxième équation (v11=46), et finalement la troisième équation (v2=222). A chaque fois qu'on résout une équation, on met à jour le système d'équations avec la donnée reconstruite, ce qui permet d'avoir pour chaque équation une seule inconnue. De la même façon, on applique ce même ordre de résolution pour résoudre le système d'équations de la troisième bande. On peut ainsi s'affranchir de l'étape de recherche des équations à une inconnue du système d'équations, étape qui augmente considérablement la complexité du décodage. On optimise ainsi le temps de décodage. On peut noter que ce gain de temps sera d'autant plus important que la taille de la matrice génératrice ou de contrôle de parité sera importante. 5.4 Variantes de réalisation On a décrit ci-dessus un exemple de mise en oeuvre de l'invention pour le stockage de données et le décodage de données stockées utilisant un code correcteur d'erreur de type LDGM. Bien entendu, l'invention ne se limite pas à ce type de code correcteur d'erreurs, et tous codes en graphe de type sparse (i.e dont la matrice génératrice et/ou la matrice de contrôle de parité est creuse) peut être utilisé. Par exemple, il est possible d'utiliser un code correcteur d'erreurs de type code LDPC non-binaire à structure quasi-cyclique en escalier (« Staircase Quasi Cyclic LDPC Non-Binaire »), dont la construction de base est notamment décrite dans les documents «A hardware efficient LDPC encoding scheme for exploiting decoder structure and resources » (VTC Spring'07, 2007, pp. 2445- 2449) et « Arbitrary bit generation and correction technique for encoding GC-LDPC codes with dual- diagonal parity structure » (WCNC'07, 2007, pp. 662-666) de C. Yoon et al. Selon cet exemple, on peut construire le code pour stocker les données sur douze disques durs et les protéger de trois effacements. L'étape de construction du code propose de respecter la structure en escalier, qui permet un encodage à faible coût grâce à l'algorithme de transformation de la matrice de contrôle de parité H proposée dans le document « Efficient encoding of Low-Density Parity-Check Codes » (T.J. Richardson et R.L. Urbanke, IEEE Transactions on Information Theory, Vol. 47, N°2, Février 2001), et de construire une matrice de base de taille relativement faible sans cycle de taille 6. Ensuite, le caractère quasi cyclique permet d'étendre facilement la taille de la matrice. En considérant une taille de secteur de 512 octets par disque et une taille de bande (« stripe ») d'un secteur, la taille du code obtenu est : N = Nombre de disques x taille d'une bande = 12 x 512 = 6144. Le nombre d'équations du système d'équations à résoudre est donc de M = 3 x 512 = 1536. Les résultats de simulation montrent un gain remarquable du temps de décodage notamment. Ainsi, on constate une moyenne de 0,170 ms par bande pour le codage/stockage des données, et 780 ms pour le décodage de la première bande puis une moyenne de 0,060 ms pour les bandes suivantes. De plus, tous les cas d'effacements de trois disques ont été corrigés sans erreur. 5.5 Structures simplifiées d'un dispositif de stockage et d'un dispositif de décodage On présente finalement, en relation avec les figures 11 et 12 respectivement, la structure simplifiée d'un dispositif de stockage de données et la structure simplifiée d'un dispositif de décodage de données stockées selon un mode de réalisation de l'invention. Comme illustré en figure 11, un dispositif de stockage de données selon au moins un mode de réalisation de l'invention comprend une mémoire 111 comprenant une mémoire tampon, une unité de traitement 112, équipée par exemple d'un microprocesseur [IP, et pilotée par le programme d'ordinateur 113, mettant en oeuvre le procédé de stockage de données selon au moins un mode de réalisation de l'invention. A l'initialisation, les instructions de code du programme d'ordinateur 113 sont par exemple chargées dans une mémoire RAM avant d'être exécutées par le processeur de l'unité de traitement 112. L'unité de traitement 112 reçoit en entrée au moins un vecteur de données source. Le microprocesseur de l'unité de traitement 112 met en oeuvre les étapes du procédé de stockage de données selon au moins un mode de réalisation décrit précédemment, selon les instructions du programme d'ordinateur 113, pour coder le ou les vecteurs de données source, et distribuer les symboles du ou des vecteurs à stocker ainsi obtenus sur les différents supports de stockage. Pour cela, le dispositif de stockage de données comprend, outre la mémoire tampon 111, un module de détermination 114 des variables composant au moins un cycle d'arrêt du code, un module de détermination 115 d'un schéma d'allocation desdites variables, allouant à chaque variable composant un cycle d'arrêt un support de stockage distinct, et un module de répartition 116 des variables ou des données associées aux variables sur les supports de stockage, selon le schéma d'allocation. Ces modules sont pilotés par le microprocesseur de l'unité de traitement 112. Comme illustré en figure 12, un dispositif de décodage de données stockées selon au moins un mode de réalisation de l'invention comprend une mémoire 121 comprenant une mémoire tampon, une unité de traitement 122, équipée par exemple d'un microprocesseur [IP, et pilotée par le programme d'ordinateur 123, mettant en oeuvre le procédé de décodage selon au moins un mode de réalisation de l'invention. A l'initialisation, les instructions de code du programme d'ordinateur 123 sont par exemple chargées dans une mémoire RAM avant d'être exécutées par le processeur de l'unité de traitement 122. L'unité de traitement 122 dispose d'un ensemble de données stockées sur des supports de stockage, dont l'un au moins peut être défaillant. Le microprocesseur de l'unité de traitement 122 met en oeuvre les étapes du procédé de décodage décrit précédemment, selon les instructions du programme d'ordinateur 123, pour retrouver l'ensemble des données source à partir des données stockées. Pour cela, le dispositif de stockage comprend, outre la mémoire tampon 121, un module de décodage comprenant un module de recherche 124, dans un système d'équations représentatif du code, d'au moins une équation présentant une seule variable associée à une donnée préalablement stockée sur le ou les supports de stockage défaillants, dite variable effacée, un module de reconstruction 125 de la ou des variables effacées, par résolution de la ou des équations, délivrant au moins une donnée reconstruite, un module de mise à jour 126 du système d'équations tenant compte de la ou des données reconstruites, activés au moins une fois, lorsqu'au moins un des supports de stockage est défaillant. Ces modules sont pilotés par le microprocesseur de l'unité de traitement 122.5 REVENDICATIONS1. Procédé de stockage de données, mettant en oeuvre un code correcteur d'erreurs définissant un ensemble de variables liées par des contraintes, chaque variable étant associée à des données source et/ou des données de redondance, caractérisé en ce que ledit procédé met en oeuvre les étapes suivantes : détermination (31) des variables composant au moins un cycle d'arrêt dudit code, détermination (32) d'un schéma d'allocation desdites variables, allouant à chaque variable composant un cycle d'arrêt un support de stockage distinct, répartition (33) desdites variables ou des données associées auxdites variables sur lesdits supports de stockage, selon ledit schéma d'allocation. 2. Procédé de stockage de données selon la revendication 1, caractérisé en ce que ledit code correcteur d'erreurs est de type code en graphe creux, dit code en graphe « sparse », dont la matrice génératrice ou la matrice de contrôle de parité est une matrice creuse. 3. Procédé de stockage de données selon l'une quelconque des revendications 1 et 2, caractérisé en ce que ledit code correcteur d'erreurs est systématique. 4. Procédé de stockage de données selon l'une quelconque des revendications 1 à 3, caractérisé en ce qu'il met en oeuvre une étape préalable de construction (30) dudit code, mettant en oeuvre la détermination d'une matrice génératrice ou d'une matrice de contrôle de parité formée à partir d'une répétition d'au moins un motif prédéterminé, dite matrice structurée. 5. Procédé de stockage de données selon l'une quelconque des revendications 1 à 4, caractérisé en ce que ladite étape de répartition (33) stocke les données associées à une variable donnée sur un même support de stockage. 6. Procédé de stockage de données selon l'une quelconque des revendications 1 à 4, caractérisé en ce que ladite étape de répartition (33) stocke les données associées à une même variable sur des supports de stockage distincts. 7. Procédé de stockage de données selon l'une quelconque des revendications 1 à 6, caractérisé en ce que lesdits supports de stockage appartiennent au groupe comprenant : des disques durs, des bandes magnétiques, des mémoires flash. 8. Dispositif de stockage de données utilisant un code correcteur d'erreurs définissant un ensemble de variables liées par des contraintes, chaque variable étant associée à des données source et/ou des données de redondance, caractérisé en ce qu'il comprend :un module de détermination des variables composant au moins un cycle d'arrêt dudit code, un module de détermination d'un schéma d'allocation desdites variables, allouant à chaque variable composant un cycle d'arrêt un support de stockage distinct, un module de répartition desdites variables ou des données associées auxdites variables sur lesdits supports de stockage, selon ledit schéma d'allocation. 9. Procédé de décodage de données stockées sur une pluralité de supports de stockage, lesdites données ayant été préalablement stockées sur ladite pluralité de supports de stockage en mettant en oeuvre un code correcteur d'erreurs définissant un ensemble de variables liées par des contraintes, chaque variable étant associée à des données source et/ou des données de redondance, et des étapes de : - détermination des variables composant au moins un cycle d'arrêt dudit code, - détermination d'un schéma d'allocation desdites variables, allouant à chaque variable composant un cycle d'arrêt un support de stockage distinct, répartition desdites variables ou des données associées auxdites variables sur lesdits supports de stockage, selon ledit schéma d'allocation, caractérisé en ce que ledit procédé de décodage met en oeuvre une étape de décodage (100) comprenant au moins une itération des étapes suivantes, lorsqu'au moins un desdits supports de stockage est défaillant : recherche (101), dans un système d'équations représentatif dudit code, d'au moins une équation présentant une seule variable associée à une donnée préalablement stockée sur ledit au moins un support de stockage défaillant, dite variable effacée, reconstruction (102) de ladite ou desdites données associées à ladite ou auxdites variables effacées, par résolution de la ou desdites équations, délivrant au moins une donnée reconstruite, mise à jour (103) dudit système d'équations tenant compte de ladite au moins une donnée reconstruite. 10. Procédé de décodage de données selon la revendication 9, caractérisé en ce que, ladite étape de répartition stockant les données source ou de redondance affectées à une variable donnée sur un même support de stockage, ledit procédé de décodage mémorise l'ordre de résolution des équations dudit système d'équations mise en oeuvre lors de l'étape de décodage d'un premier ensemble de données stockées, et en ce que, lors de l'étape de décodage d'au moins un deuxième ensemble de données stockées, ledit procédé de décodage résout les équations dudit système d'équations selon ledit ordre de résolution. 11. Dispositif de décodage de données stockées sur une pluralité de supports de stockage, lesdites données ayant été préalablement stockées sur ladite pluralité de supports de stockage au moyen d'un dispositif de stockage de données utilisant un code correcteur d'erreurs définissant un ensemble de variables liées par des contraintes, chaque variable étant associée à des données source et/ou des données de redondance, et comprenant : un module de détermination des variables composant au moins un cycle d'arrêt dudit code, un module de détermination d'un schéma d'allocation desdites variables, allouant à chaque variable composant un cycle d'arrêt un support de stockage distinct, un module de répartition desdites variables ou des données associées auxdites variables sur lesdits supports de stockage, selon ledit schéma d'allocation, caractérisé en ce que ledit dispositif de décodage comprend un module de décodage comprenant les modules suivants activés au moins une fois lorsqu'au moins un desdits supports de stockage est défaillant : un module de recherche (124), dans un système d'équations représentatif dudit code, d'au moins une équation présentant une seule variable associée à une donnée préalablement stockée sur ledit au moins un support de stockage défaillant, dite variable effacée, un module de reconstruction (125) de la ou desdites données associées à la ou auxdites variables effacées, par résolution de la ou desdites équations, délivrant au moins une donnée reconstruite, un module de mise à jour (126) dudit système d'équations tenant compte de ladite au moins une donnée reconstruite. 12. Programme d'ordinateur comportant des instructions pour l'exécution des étapes du procédé de stockage de données selon l'une quelconque des revendications 1 à 7 ou du procédé de décodage de données stockées selon l'une quelconque des revendications 9 et 10 lorsque ledit programme est exécuté par un ordinateur.