Améliorer les performances de sérialisation: texte par rapport à un format binaire
-
21-08-2019 - |
Question
Dois-je préfère sérialisation binaire sérialisation ascii / texte si la performance est un problème?
Quelqu'un at-il testé sur une grande quantité de données?
La solution
J'utilisé boost.serialization pour stocker des matrices et des vecteurs représentant les tables de recherche et des méta-données (chaînes) avec une taille mémoire d'environ 200MByte. IIRC pour le chargement de disque en mémoire il a fallu 3 minutes pour l'archive texte par rapport à 4 secondes en utilisant l'archive binaire sur Windows XP.
Autres conseils
étalonnées pour un problème impliquant le chargement d'un gros lots contenant la classe (en milliers) de classes archivées imbriquées.
Pour modifier le format, utiliser les flux d'archives
boost::archive::binary_oarchive
boost::archive::binary_iarchive
au lieu de
boost::archive::text_oarchive
boost::archive::text_iarchive
Le code pour charger l'archive (binaire) ressemble à:
std::ifstream ifs("filename", std::ios::binary);
boost::archive::binary_iarchive input_archive(ifs);
Class* p_object;
input_archive >> p_object;
Les fichiers et WallTimes pour une construction gcc optimisée de l'extrait de code ci-dessus sont:
- ascii:. 820MB (100%), 32,2 secondes (100%)
- binaire:. 620MB (76%), 14,7 secondes (46%)
Ceci est d'un lecteur à état solide, sans aucune compression de flux.
Ainsi, le gain de vitesse est plus grande que la taille du fichier suggère, et vous obtenez un bonus supplémentaire à l'aide binaire.
Je vous suggère de regarder dans protobuf - Protocol Buffers si la performance est un problème