Question

J'ai des fichiers de données qui sont écrits comme tag = valeur, où balise est une chaîne et la valeur peut être numérique, chaîne, tableau, etc. J'utiliser ce format car est lisible et peut être modifié facilement. Maintenant, chaque classe est instancié à l'aide de ce format a une méthode de charge et il lit les étiquettes dont il a besoin et utiliser les valeurs trouvées dans ces balises. Je veux faire binaire de données pour augmenter la vitesse de chargement. Un moyen serait d'avoir un ToBinary (le nom n'a pas d'importance) méthode dans toutes les classes qui lit les anciennes données et écrire dans un fichier et le nouveau fichier est utilisé pour instancier l'objet. Cela peut être fait en ligne, une seule fois / application. Avez-vous d'autres suggestions pour cela? J'utilise C ++ pour cela.

Edit: Je pense que la plupart cher est maintenant d'analyser le fichier quand je l'ai lu et après que pour rechercher l'étiquette que j'ai besoin, de ne pas lire le fichier à partir du disque. Je peux utiliser le système de fichiers personnalisé pour avoir plusieurs petits fichiers dans un seul gros fichier.

Était-ce utile?

La solution

J'ai une classe de base de sérialisation pour cela, avec A / De fonctions avec une petite tête où la gestion des versions peut être intégrée. Je pense que un bon système pour les données plus simples qui doivent être stockés localement et dans la plupart des cas est « lecture seule ».

Quelque chose comme ceci:

class SeralizeMe
{
public:

 virtual bool To(Archive &file)=0;
 virtual bool From(Archive &file)=0;

 virtual bool NeedsSave(void)=0;

};

Cependant, ne pas utiliser ce système si vous:

  • doit changer le format souvent.
  • a besoin pour sélectionner les données à charge et ce à stocker.
  • Utiliser des fichiers volumineux, qui est particulare sensible aux pannes d'électricité tout en économisant.

Si l'une des appliquer ci-dessus, utilisez une base de données, FirebirdSQL embarqué est un concurrent approprié.

Autres conseils

Je ne l'ai pas utilisé, mais je suis sûr que Module Boost sérialisation est un bon endroit pour commencer.

Si vous utilisez un fichier, puis en utilisant des données binaires améliorera probablement pas vos performances de manière significative, à moins que vous avez très grande partie des données à stocker dans le fichier (images, vidéos ...).

Mais de toute façon, vous pouvez utiliser un algorithme de sérialisation binaire, comme celui de Boost .

Un autre est protobuf de google. Pas le plus rapide, mais il peut prendre en charge les types de données en évolution et est très efficace sur le réseau et soutient d'autres langues.

Lien .

Si vous souhaitez améliorer les performances, vous devrez utiliser des champs de longueur fixe. Parser, ou champs de longueur de chargement variable ne fournit pas une augmentation significative des performances. La lecture par ligne de texte implique la numérisation pour la fin de jeton de ligne. déchets temps numérisation.

Avant d'utiliser l'une des suggestions suivantes, le profil de votre code pour établir un temps de référence ou le numéro de la performance. Pour ce faire, après chaque suggestion, car il vous permettra de calculer le delta de performance de chaque optimisation. Ma prédiction est que le delta deviendra plus petit avec chaque optimisation.

je suggère d'abord convertir le fichier en enregistrements de longueur fixe, en utilisant encore le texte. champs Pad avec des espaces si nécessaire. Ainsi, connaissant la taille d'un enregistrement, vous pouvez bloquer lire dans la mémoire et traiter la mémoire comme un tableau. Cela devrait permettre une amélioration significative.

À ce stade, vos goulots d'étranglement sont encore introduire la vitesse d'E / S, que vous ne pouvez pas vraiment apporter des améliorations importantes sur (parce que le fichier E / S est contrôlé par le système d'exploitation), et scannning / conversion de texte. Quelques optimisations supplémentaires sont: de convertir du texte en nombres et enfin convertir en binaire. A tout prix, préfèrent conserver le fichier de données sous forme lisible par l'homme.

Avant de faire le fichier de données tout moins lisible, essayez diviser votre application en fils. Un fil gère l'interface utilisateur graphique, une autre entrée, et un autre pour le traitement. L'idée est d'avoir le processeur toujours exécuter une partie de votre code plutôt que d'attendre. Dans les plates-formes modernes, peut être effectuée d'E / S de fichier alors que le CPU est en train de traiter votre code.

Si vous ne voyez pas attention sur la portabilité, si votre plate-forme a une capacité DMA (un composant DMA ou Direct Memory Access permet des transferts de données sans utiliser le processeur ou minimiser l'utilisation du processeur). Quelque chose à surveiller est que de nombreuses plates-formes partagent l'adresse et du bus de données entre le processeur et DMA. Ainsi, l'un des composants est bloqué ou suspendu alors que les autres utilisations du bus d'adresses et données. Ainsi, il peut aider ou non. Cela dépend de la façon dont la plate-forme est câblé.

Convertir le domaine clé de numéros d'utilisation, alias jetons . Étant donné que les jetons sont numériques, ils peuvent être utilisés comme indices dans les tables de saut (commutateur aussi des déclarations) ou seulement des indices dans les tableaux.

En dernier recours, convertir le fichier en binaire. La version binaire doit avoir deux champs: clés jeton, et la valeur. Haul dans les données en gros morceaux dans la mémoire.

Résumé

  1. Haul gros blocs de données dans mémoire.
  2. Profil avant de modifier établir une performance de base mesure.
  3. Optimiser une étape à la fois, le profilage après chaque optimisation.
  4. Vous préférez garder fichier de données chez l'homme forme lisible.
  5. Réduire au minimum les modifications du fichier de données.
  6. Convertir un fichier à utiliser longueur fixe champs.
  7. Essayez d'utiliser des fils ou des multi-tâches si l'application n'attend pas.
  8. Convertir le texte à jetons numériques (Réduit la lisibilité humaine)
  9. données convertir en binaire en dernier recours (très difficile pour l'homme à lire et debug).

J'ai deux idées pour vous:

1) Si la liste des tags est constante et connue à l'avance, vous pouvez convertir chacun en un BYTE, (ou mot), suivi de la longueur de la valeur (en octets), suivi de la c-chaîne brute de la charge utile de la valeur.

Par exemple, étant donné les éléments suivants:

Tag1 = "hello World!" // 12 bytes in length (achieved by "strlen(value) * sizeof(char)" )
Tag2 = "hello canada!"  // 13 bytes in length 

Vous pourriez transformer ce dans le flux d'octets:

0x0001 0x000B // followed by 12 bytes representing the 'value' // 0x0002 0x000C // followed by 13 bytes representing 'value2'

Votre programme aurait juste besoin de savoir que l'en-tête MOT « 0x0001 » représente Tag1, et l'en-tête « 0x0002 » représente Tag2.

Vous pouvez même plus abstraite les noms de balises si vous ne connaissez pas à l'avance, en suivant une longueur similaire, la structure de valeur.

2) Peut-être le peu lent est juste votre implémentation de l'analyse de texte? Envisagez d'utiliser une bibliothèque open source dédié à ce que vous essayez de faire. Exemple: " boost :: property_tree "

arbre de la propriété est spécialement conçu pour stocker et récupérer des paires de clés valeur (conçus pour être utilisés en tant que fichier de configuration). Mais je suppose que cela dépend combien de ces paires que vous essayez de stocker pour que cela soit économique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top