Question

Dans notre application, nous utilisons std::map pour stocker (clé, valeur) données et sérialisation utiliser pour stocker les données sur le disque. Avec cette approche, nous constatons que l'E / S disque est goulot d'étranglement et trouver des valeurs en utilisant la clé n'est pas très rapide.

Je suis venu à travers LevelDB et penser à l'utiliser. Mais j'ai quelques questions.

  1. la documentation LevelDB dit son fait pour (string, string) paire de valeurs de clé. Est-ce que cela signifie que je ne peux pas utiliser pour des paires de valeurs de clé personnalisée?
  2. Il semble que la différence entre std::map et LevelDB est que LevelDB est des œuvres persistantes et std::map en mémoire. Alors, est-ce que cela signifie le goulot d'étranglement E / S disque sera plus problématique pour LevelDB.

Plus précisément quelqu'un peut-il expliquer s'il vous plaît si LevelDB pourrait être meilleur choix que std::map?

PS: J'ai essayé d'utiliser hash_maps mais il semble être plus lent que std::map

Était-ce utile?

La solution

LevelDB ne vient autre chose que std :: carte.

Êtes-vous vraiment dire que vous voulez (haute performance) pour la persistance std :: map?

    regard
  • à std :: carte avec un allocateur personnalisé. Allouer les entrées d'une région cartographiée mémoire et de l'utilisation fsync pour assurer que l'information touche le disque à des moments stratégiques dans le temps.

  • combiner peut-être avec EASTL (qui dispose d'une plus rapide std :: carte et se développe avec Répartiteurs personnalisés - en fait, ils n'ont pas allocateur par défaut)

  • regard sur le réglage de votre hash_map (std :: unorderded_map); si hash_maps sont plus lents, vous devriez regarder dans (a) loadfactor (b) le réglage de la fonction de hachage

  • last but not least: évaluer l'utilisation de Boost sérialisation pour la sérialisation binaire de votre carte (quelle que soit la mise en œuvre que vous avez choisi). Dans mon expérience Boost performances de sérialisation est supérieure de la facture.

Autres conseils

Qu'est-ce que vous faites maintenant est la suivante:

Disons que vous avez 1000000 enregistrements dans un fichier. Vous lisez le tout fichier dans std :: carte, cela prend environ ~ 1000000 opérations. Vous trouverez utilisez / Inser pour localiser et / ou insérer un élément, cela prend du temps logarithmique (environ 20 comparaisons). Et maintenant, vous enregistrez le fichier entier à nouveau, transférer tous ces 1000000 dossiers dans le fichier.

Le problème est que vous bénéficiez absolument rien d'utiliser std :: carte. std :: carte vous permet de rechercher rapidement les temps (logarithmique), mais l'initialisation et la sérialisation la carte entière par chaque recherche avantages de annulait elle.

Qu'est-ce que vous avez besoin est redessiner soit vous programmez donc vous chargerez la carte une fois au démarrage et sérialiser une fois à la fin. Ou, peut-être si vous avez besoin de la sémantique de base de données, allez pour une mise en œuvre réelle de la base de données. Je suggère d'utiliser SQLite, bien que LevelDB pourrait être tout aussi bon pour vous.

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