Dans la communauté bio-informatique, pour le stockage des données de séquençage cartographiées, le format d'alignement de séquence (SAM / BAM) est la norme. Pour info, le format de cartographie d'alignement de séquence, en anglais sequence alignment map (SAM), est un format d'alignement générique pour stocker les alignements de lecture par rapport aux séquences de référence, prenant en charge les lectures courtes et longues (jusqu'à 128 Mbps) produites par différentes plateformes de séquençage. Autrement dit, c'est un format texte permettant de stocker des séquences biologiques alignées sur une séquence de référence.
Il existe un grand nombre d'outils de traitement des fichiers SAM / BAM pour l'analyse. Entre autres, on peut citer elPrep, SAMtools, Picard et Genome Analysis Toolkit (GATK). BMC Bioinformatics, une revue scientifique couvrant la bio-informatique et la biologie computationnelle, a effectué une étude sur elPrep, un framework multi-thread établi pour la préparation de fichiers SAM et BAM dans des pipelines de séquençage. L'objectif est de voir parmi les langages de programmation comme Go, C++ 17 et Java, lequel est plus approprié pour la gestion de la mémoire de tas qui est une tâche complexe dans elPrep.
Pour obtenir de bonnes performances, l'architecture logicielle d'elPrep ne fait qu'un seul passage dans un fichier SAM / BAM pour plusieurs étapes de préparation et conserve le séquençage des données autant que possible dans la mémoire principale. Semblable à d'autres outils SAM / BAM, la gestion de la mémoire de tas est une tâche complexe dans elPrep, et elle est devenue un sérieux goulot d'étranglement de la productivité dans son langage d'implémentation d'origine. BMC Bioinformatics a donc « étudié trois langages de programmation alternatifs : Go et Java en utilisant un récupérateur de mémoire parallèle d'une part, et C ++ 17 en utilisant le comptage de références d'autre part pour gérer de grandes quantités d'objets de tas ».
L'exécution d'un pipeline de préparation typique à l'aide de l'architecture logicielle d'elPrep dans les trois langages de programmation sélectionnés montre que l'implémentation Go est la plus performante, suivie de l'implémentation Java, puis de l'implémentation C ++ 17, selon BMC Bioinformatics. Pour parvenir à ce résultat, ils ont utilisé un pipeline de préparation en cinq étapes à savoir tri des lectures pour l'ordre des coordonnées, suppression des lectures non mappées, marquage des lectures en double, remplacement des groupes de lecture, réorganisation et filtrage du dictionnaire de séquences. Ce pipeline est exécuté 30 fois pour chaque implémentation et ils ont enregistré le temps écoulé et l'utilisation maximale de la mémoire pour chaque exécution à l'aide de la commande de temps Unix.
C++ 17 et Java auraient permis un réglage fin de leur gestion de la mémoire, conduisant chacun à quatre variations. Pour le classement final dans cette section, les chercheurs ont choisi le meilleur résultat de chaque ensemble de variations, une pour C++ 17 et une pour Java. Les tests de performances Go ont été exécutés avec les paramètres par défaut. Go a besoin en moyenne de 7 minutes 56,152 secondes avec un écart type de 8,571 secondes ; Java a besoin en moyenne de 6 minutes 54,546 secondes avec un écart type de 5,376 secondes ; et C ++ 17 a besoin en moyenne de 10 minutes 23,603 secondes avec un écart type de 22,914 secondes. Les intervalles de confiance pour Go et Java sont très serrés, avec un intervalle de confiance légèrement plus grande pour C ++ 17.
Les résultats de référence pour l'utilisation maximale de la mémoire sont présentés sur la figure ci-dessous. Go a besoin en moyenne de 221,73 Go avec un écart type d'environ 6,15 Go ; Java a besoin en moyenne de 335,46 Go avec un écart type d'environ 0,13 Go ; et C ++ 17 a besoin en moyenne de 255,48 Go avec un écart type d'environ 2,93 Go. Les intervalles de confiance sont très serrés.
Le but d'elPrep est de maintenir simultanément à la fois le temps d'exécution et l'utilisation de la mémoire. Pour déterminer le classement final, BMC Bioinformatics a multiplié le temps moyen écoulé de l'horloge murale en heures (h) par l'utilisation maximale moyenne de la mémoire en gigaoctets (Go), les valeurs inférieures en gigaoctets heures (GBh) étant meilleures. Cela donne les valeurs suivantes : 29,33 Goh pour Go, 38,63 Goh pour Java et 44,26 Goh pour C ++ 17.
Par conséquent, BMC Bioinformatics conclut que l'implémentation Go est la plus performante, offrant le meilleur équilibre entre les performances d'exécution et l'utilisation de la mémoire. Alors que les benchmarks Java signalent un temps d'exécution un peu plus rapide que les benchmarks Go, l'utilisation de la mémoire des runs Java est nettement plus élevée. Les benchmarks C++ 17 s'exécutent beaucoup plus lentement que Go et Java, tout en utilisant un peu plus de mémoire que les exécutions Go. « Sur la base de nos résultats de référence, nous avons choisi Go comme nouveau langage d'implémentation pour elPrep, et nous recommandons de considérer Go comme un bon candidat pour développer d'autres outils bio-informatiques pour le traitement des données SAM / BAM ».
Toutefois, les internautes remettent en question la méthode et la manière dont BMC Bioinformatics a codé le pipeline dans chaque langage, surtout le code du C++ 17. Le code C++ serait écrit comme s'il n'y avait pas de type statique. Il semblerait que BMC Bioinformatics ait fidèlement porté la nature très dynamique de leur code existant en C++. C'est ce qui aurait affecté la performance du C++ 17. En parlant de structure de données, BMC Bioinformatics aurait utilisé également std::unordered_map <int, any>. Or, le conteneur associatif non ordonné, unordered_map, serait très lent (ne convenant pas au matériel moderne, car basé sur un nœud). Par conséquent, C++ est lent parce qu'ils l'ont comme un langage typé dynamique et ils ont choisi les mauvaises structures de données, pensent certains.
Source : BMC Bioinformatics
Et vous ?
Que pensez-vous de cette étude ?
Êtes-vous d'accord ou pas avec les résultats de l'étude ? Pourquoi ?
Selon vous, C++ serait-il plus lent que Java et Go ? Pourquoi ?
Voir aussi
C++ 20 : la spécification de la nouvelle version du langage C++ est finalisée, un tour d'horizon des nouveautés apportées
C++17 est maintenant officialisé, la norme a été publiée sur le site de l'Organisation internationale de normalisation (ISO)
« Pourquoi on est repassé de Go à PHP ? », Danny van Kooten, l'éditeur de MailChimp nous livre les raisons de ce rebasculement
Le langage Go continue sa progression avec de nombreux développeurs qui l'utilisent dans les projets professionnels et personnels selon un sondage
Java 15 est déjà sur les rails : la prochaine version standard ajoutera des blocs de texte et des Garbage Collectors, et supprimera le moteur JavaScript Nashorn
Entre C++17, Go, et Java, lequel est plus performant pour un outil de séquençage ?
Go offre le meilleur équilibre entre le temps d'exécution et l'utilisation de la mémoire, selon une étude
Entre C++17, Go, et Java, lequel est plus performant pour un outil de séquençage ?
Go offre le meilleur équilibre entre le temps d'exécution et l'utilisation de la mémoire, selon une étude
Le , par Bill Fassinou
Une erreur dans cette actualité ? Signalez-nous-la !