Bonjour,
je dois réaliser un programme de conversion de données et je rencontre des problèmes de performance...
Mon fichier d'entrée est un fichier binaire contenant des données scientifiques selon un format bien précis. Certaines de ces données ne prennent que quelques bits, par exemple, sur un des octets j'ai:
bit 0 = météo (0=soleil, 1=pluie)
bits 1 à 4 = type de capteur (entier non signé sur 4 bits)
bit 5 = validité mesure (0=valide, 1=invalide)
bit 6 et 7 = numero de version (entier non signé sur 2 bits)
Dans ce fichier d'entrée j'ai un ensemble de mesures. Chaque mesure suit toujours le même "motif" de données sur 20 octets, et je peux avoir un grand nombre de mesures dans mon fichier (plusieurs millions).
Mon fichier de sortie peux être de deux sortes (le programme doit pouvoir faire les deux types de conversion):
- Fichier binaire du même type que le fichier d'entrée mais avec une organisation différente ("motif" différent, sur 52 octets)
- Fichier au format HDF5.
J'ai fait le programme suivant:
- une classe Mesure qui représente une seule mesure: elle aura des attributs tels que "bool validite_mesure", "short type_capteur", "short numero_version",... et une méthode qui lit des informations extraites du fichier d'entrée pour renseigner ces attributs.
- des classes FichierEntree, FichierSortieBin et FichierSortieHDF5.
Dans FichierEntree, je lis un bloc de mesures et le transforme en un tableau d'objets Mesure. Ensuite j'appelle la méthode "convertir" de ma classe FichierSortieBin ou FichierSortieHDF5, qui se charge de créer des données dans le bon format à partir du tableau de Mesures, puis les écrire dans le fichier binaire ou HDF5. Je répète la lecture/mise en forme/ecriture, bloc par bloc jusqu'à atteindre la fin du fichier d'entrée.
Pour extraire les données et les convertir j'ai beaucoup utilisé l'objet std::bitset. C'est le seul moyen que j'ai trouvé pour récupérer les données comme je le souhaite. Cependant mon programme est très lent... il me faut presque 1h pour convertir un fichier de 2 millions de mesures alors que j'ai un PC correct (Windows 7 - Intel core i5 - 8Go de RAM). Après quelques tests je constate que la lenteur vient clairement des parties du code utilisant les bitset.
Je voulais savoir comment vous auriez procédé pour résoudre ce genre de problème? Y a t-il des manières plus simples de faire?
Merci d'avance et désolée pour le pavé!
Partager