IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

c++ boost cache


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre habitu�
    Homme Profil pro
    �tudiant
    Inscrit en
    Mai 2020
    Messages
    12
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mai 2020
    Messages : 12
    Par d�faut c++ boost cache
    Bonjour � tous,


    Avant de cr�er le sujet, j'ai pu faire des recherches via les documentations officielles, les forums (connus) mais malheureusement, je n'ai pas ou tr�s pu eu de r�ponse.

    Contexte :

    J'essaye de concevoir un cache pour stocker certaines donn�es li�es � des param�tres qui sont tr�s souvent demand�es. Le but est d'�viter de toujours rechercher la m�me chose sachant que juste avant j'ai d� sortir les m�mes donn�es en r�ponse.

    L'id�e a �t� de d�velopper un cache LRU. J�utiliserais ce cache � divers endroits de mon code dans diff�rentes fonctions de diff�rentes classes ; le but est d�attraper les valeurs entrantes et sortantes de certaines fonctions pour les stocker dans mon cache.

    Donc il y a aussi un souci que mon cache ne doit pas �tre cr�� et d�truit � chaque processus, cela perdrait de son sens.

    �pres avoir fait un prototype en c++ sans librairie (pour ne pas se perdre dans plein de documents, je ne posterais pas ce code-ci, car ce n'est pas le sujet principal de mon poste.), je me suis int�ress� � la libraire Boost pour trouver des ajouts et optimiser certains cas. Id�e tr�s plaisante, car j'ai pu trouver dans la documentation un point hyper int�ressant � utiliser :

    https://www.boost.org/doc/libs/1_34_....html#example9 .

    Suite � cela, j'ai recherch� � droite � gauche et trouver un exemple qui me paraissait assez simple et possible � utiliser.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    #include <boost/multi_index_container.hpp>
    #include <boost/multi_index/sequenced_index.hpp>
    #include <boost/multi_index/hashed_index.hpp>
    #include <boost/multi_index/key.hpp>
     
    template<typename Tkey, typename Tval>
    class CacheWeb{
      private:
      using value_type = std::pair<Tkey, Tval>;
     
      unsigned int capacity;
      boost::multi_index_container<
        value_type,
        boost::multi_index::indexed_by<
          boost::multi_index::sequenced<>,
          boost::multi_index::hashed_unique<boost::multi_index::key<&value_type::first>>
        >
      > container;
     
      CacheWeb(const CacheWeb&) = delete;
      CacheWeb& operator=(const CacheWeb&) = delete;
     
      int capacityOut(){
          if( capacity == 0 || container.size() < capacity ) {
            return 0;
          }
          int cnt = 0;
          while(container.size() > capacity) {
            container.pop_back();
            ++cnt;
          }
          return cnt;     
      };
     
      public:
      CacheWeb(int icapacity) : capacity(icapacity){};
      virtual ~CacheWeb() = default;
     
     
      int size(){
        return container.size();
      };
      bool empty(){
        return container.empty();
      };
      void clear(){
        container.clear();
      };
     
      bool contains(const Tkey& key){
        const auto& lookup = container.template get<1>();
        return lookup.find(key) != container.template get<1>().end();
      };
     
      void remove(const Tkey& key){
        container.erase(key);
      };
     
      void put(const Tkey& key, const Tval& val){
        auto& lookup = container.template get<1>();
        auto it = lookup.find(key);
        if( it != lookup.end() ) {
          lookup.modify(it,[&](value_type& x){ x.second = val; });
        }
        else{
          it=lookup.emplace(key, val).first;
        }
        container.relocate(container.begin(),container.template project<0>(it));
        capacityOut();
      };
     
      std::list<std::pair<Tkey, Tval>>getItems(){
        return {container.begin(), container.end()};
      };
     
      const Tval& get(const Tkey& key){
        const auto& lookup = container.template get<1>();
        const auto it = lookup.find(key);
        if( it == lookup.end() ) {
          throw std::invalid_argument("Key does not exist");
        }
        return it->second;
      }
    };
     
    #include <iostream>
     
    int main()
    {
      CacheWeb<int,int> c(10);
      for(int i=0;i<11;++i)c.put(i,i);
     
      for(const auto& x:c.getItems()){
        std::cout<<"("<<x.first<<","<<x.second<<")";
      }
      std::cout<<"\n";
     
      for(int i=1;i<11;++i){
        std::cout<<i<<"->"<<c.get(i)<<" ";
      }
      std::cout<<"\n";
    }

    Malheureusement, plusieurs questions me viennent � l�esprit et aussi quelques probl�matiques :

    1- A cette ligne-l� :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    boost::multi_index_container<value_type,boost::multi_index::indexed_by<boost::multi_index::sequenced<>,boost::multi_index::hashed_unique<boost::multi_index::key<&value_type::first>>>> container;
    Je ne comprends pas trop le concept derri�re ceci ? J�ai un container avec deux param�tres, ok, mais on souhaite cr�er quoi en fait comme container ? D�apr�s les recherche, c�est un type vector...


    2 � Par rapport � la ligne de code pr�c�dente, donc celle-ci :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    boost::multi_index_container<value_type,boost::multi_index::indexed_by<boost::multi_index::sequenced<>,boost::multi_index::hashed_unique<boost::multi_index::key<&value_type::first>>>> container;
    J�ai export� le code et builder un peu pour mieux comprendre ce qu�il faisait, mais j�obtiens quelques erreurs :

    2.1: Too few template arguments for class template 'sequenced'clang(template_arg_list_different_arity)


    2.2: No member named 'key' in namespace 'boost::multi_index'clang(no_member)

    J�ai essay� de r�gler le probl�me en modifiant le container
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    boost::multi_index::key<&value_type::first>
    Par ceci :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    boost::multi_index::member<value_type,Tkey,&value_type::first>


    Malheureusement, j�obtiens cette erreur : error: template argument 2 is invalid


    3 � Derni�re question, je comprends mal certains fonctions li�e a boost :

    3.1 template get<1>();
    3.2 emplace

    J�ai trifouill� dans la documents boost, mais soit j�ai louper la page ou je ne sais pas.

    Voil�, je vous remercie de lire mon poste ! Je souhaite bien sur avancer dans ce projet et mes connaissances, et je suis arriv� au moment ou je viens � la recherche d�aide.


    Je vous souhaite une bonne journ�e ou soir�e.

  2. #2
    Expert confirm�
    Avatar de Kannagi
    Homme Profil pro
    cyber-pal�ontologue
    Inscrit en
    Mai 2010
    Messages
    3 226
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 37
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : cyber-pal�ontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 226
    Par d�faut
    Je ne suis pas certain que d'utiliser un algo de cache LRU soit tr�s int�ressant en software.

    Je ne comprend pas l�int�r�t de faire �a , sauf si c'est pour une "analyse" , mais m�me l� , si on met des caches , c'est parce que les donn�es sont dynamique , si on savait� l'avance ce qu�on aurait besoin , on aurait pas de cache mais un SPM.

    Et justement je ne comprend pas ce que ton code apporterait de plus : " J'essaye de concevoir un cache pour stocker certaines donn�es li�es � des param�tres qui sont tr�s souvent demand�es. Le but est d'�viter de toujours rechercher la m�me chose sachant que juste avant j'ai d� sortir les m�mes donn�es en r�ponse."
    si vraiment ton but et de recherch� des donn�es rapidement , le cache LRU n'est vraiment pas le plus efficace pour �a.

  3. #3
    Membre habitu�
    Homme Profil pro
    �tudiant
    Inscrit en
    Mai 2020
    Messages
    12
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mai 2020
    Messages : 12
    Par d�faut
    Bonjour, je te remercie de ta r�ponse. Tr�s content de voir ce genre de r�ponse, car �a me fait penser peut-�tre � une erreur de ma part

    Bref, pour venir au sujet. J'ai recherch� le principe de cache si dans le cas pr�sent, on conna�t d�j� la quasi-totalit� des param�tres entrants et que seules les donn�es sortantes auront quelques valeurs diff�rentes. Je place le contexte : je suis un voyageur et j'ai des param�tres en entr�e qui eux sont toujours les m�mes, par exemple : Paris, Toulouse, Dijon etc..(des noms de villes), la dates etc...

    Pourquoi LRU cache, �pres diff�rentes recherches, je suis pratiquement toujours tomb� sur un LRU cache comme r�ponse � mon probl�me

    Globalement, je choisis Paris -> Toulouse et je veux qu'en sortit, il me dise juste la meilleure fa�on de parcourir cette distance, quel transport, etc....


    On peut dire qu'� chaque recherche d'un client pour le m�me parcours, certains points peuvent changer, mais d'autres pas du tout. Mon but est juste qu'en voyant les param�tres entrant comme Paris -> Toulouse, je me dis "Ha tiens, j'ai d�j� sorti une r�ponse pour ce m�me parcours il y � 1 heure" donc je peux reprendre la r�ponse stock�e dans un cache et sortir ceci plus rapidement que tout refaire � z�ro. Bien sur le cache sera actualiser a certain moment, mais c'est une autre question.

    ps: un SPM ?


    Je me suis d�j� mis dans le LRU cache donc j'essaye de pas tout l�cher avant de changer de solution, �a me permettra au pire de d�couvrir le principe du cache et LRU bien s�r je suis preneur, absolument preneur de toute solution/id�e qui pourrait m'aide � r�soudre ce petit casse-t�te de cache, le but est tout de m�me de trouver une solution

  4. #4
    Expert confirm�
    Avatar de Kannagi
    Homme Profil pro
    cyber-pal�ontologue
    Inscrit en
    Mai 2010
    Messages
    3 226
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 37
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : cyber-pal�ontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 226
    Par d�faut
    Ok , merci pour ta r�ponse enfin d�taill� , je comprend mieux.

    J'ai une question , comment tu compte ressortir les derniers valeurs ? comment fonctionne ton cache LRU ? un cache regarde l'adresse ,toi tu regarde quoi ? Les premi�res lettres ?

    Sinon , je te conseille de faire un Direct Mapped , il faut savoir que les CPU font du cache LRU parce qu'ils sont limit� en m�moire cache (un cache L1 c'est 32 Ko donc il a int�r�t d��tre efficace).
    Un cache Direct Mapped peut �tre aussi performant qu'un LRU , si il est plus gros ( a taille �gal le DM est beaucoup moins performant) , mais normalement sur PC , tu n'as pas ce genre de contrainte, � toi de voir, mais je pose la solution ici , surtout qu'un Direct Mapped est facile � impl�menter (quelque ligne litt�ralement ) :p
    Mais �a d�pend comment ton "cache" fonctionne aussi.
    Et si on parle de cache , tu sais combien de "way" tu ferra ? (pour le LRU , le DM , par d�finition c'est du 1 way) en g�n�ral on conseille 4 mini , normalement � 16 way , c'est aussi efficace que du full associative (c'est ce qu�utilise les cache L3 d'AMD ou d'Intel).

    Pour le SPM , �a veut dire ScratchPad Memory , en gros tu peux �crire dessus comme sur la RAM ,juste que c'est int�grer au cores. , donc c'est bien plus rapide , et comme ce n'est pas un cache, il est bien plus rapide d�acc�s en lecture/�criture, par contre ,c'est au programmeur de" d�cider" de savoir ce qu'il y stocke dedans.
    Pour cela que le SPM n'existe pas sur les ordinateurs grand public (mais certaine console les int�grer comme la Playstation 2 et Playstation 3 ).

  5. #5
    Membre habitu�
    Homme Profil pro
    �tudiant
    Inscrit en
    Mai 2020
    Messages
    12
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mai 2020
    Messages : 12
    Par d�faut
    Dans un premier temps, le but de mon sujet est de faire des prototypes de plusieurs solutions et de trouver la meilleure. Dans ce cas-l�, tu devines que le LRU est le premier. Faisant ce projet en groupe, je m'occupe de la partie code. Ce que j'essaye de concevoir fonctionne avec un serveur distant qui fonctionne 7/7 h24. (Merci � un ami )

    C'est comme si je simuler une solution r�el et moi je dois impl�menter mon algo dans une solution de voyage d�j� con�u


    Pour r�pondre � tes questions, je vais faire une liste et mixer certaines questions ensemble. J'excuse d'avance si vous trouvez que j'ai soit mal o� peut comprise certaine chose. J'essaie par ce type de projet de m'am�liorer et d�couvrir d'autre chose. Ce projet me tient a c�ur


    Comment fonctionne ton cache LRU ? + comment tu comptes ressortir les derni�res valeurs ?

    D'apr�s ce que j'ai compris du LRU.

    Lorsqu'une page est r�f�renc�e, la page requise peut �tre en m�moire. S'il est dans la m�moire, on d�tache le n�ud de la liste et on l'amenait au d�but de la file d'attente pour le sortir plus rapidement.

    Un cache regarde l'adresse ,toi, tu regardes quoi ?

    Je comptais cr�er un pair de cl�: la cl� serait les lettres ville + la date. Exemple: PRS-TS-1211202


    tu sais combien de "way" tu ferra ?

    Bonne question, j'avais pris connaissance du concep de way (via cette page https://www.quora.com/What-does-L1-c...ine-8-way-mean), mais j'ai du mal � le concevoir

    je r�it�re mais merci pour tes r�ponse.

  6. #6
    Expert confirm�
    Avatar de Kannagi
    Homme Profil pro
    cyber-pal�ontologue
    Inscrit en
    Mai 2010
    Messages
    3 226
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 37
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : cyber-pal�ontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 226
    Par d�faut
    Ok je pense avoir mieux compris.

    Je ne pense pas que le way te servira (en tout cas 8 way et son concept ) , si je comprend ,tu vas g�rer un nombre de valeur je pense assez cons�quent (un tableau de 128 ou 256 par exemple) et tu as besoin d'un algo pour savoir lequel tu vas virer ou garder.

    Le LRU est un algo qu'on utilise sur des adresses un peu random , mais surtout parce qu'on est assez faible en way ( par exemple sur 4 valeurs � garder, l'algo � int�r�t d��tre assez bon ).

    Si tu fait un tableau de 128 ou 256 , c'est un peu comme si tu faisais du 128 ou 256 way , ce qui du coup change beaucoup de chose
    En soit j'ai aucune id�e de l'efficacit� du LRU quand tu as autant de "way" , mais ce qui est sur c'est que peu importe l'algo , plus tu as de way, plus le "miss cache" tente de dispara�tre.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Gestion du cache web sous Jonas
    Par DaBuc dans le forum JOnAS
    R�ponses: 0
    Dernier message: 09/09/2013, 19h10
  2. 4dV12 et cache web
    Par tidus_6_9_2 dans le forum 4D
    R�ponses: 1
    Dernier message: 29/08/2011, 13h12
  3. [HTML 5] cache web app offline
    Par Glude dans le forum Balisage (X)HTML et validation W3C
    R�ponses: 0
    Dernier message: 14/03/2011, 22h52
  4. [SQL] vider le cache web
    Par timal78 dans le forum PHP & Base de donn�es
    R�ponses: 13
    Dernier message: 07/02/2008, 19h54
  5. [Projet Java] Serveur de stockage ou Proxy-cache Web
    Par Yann39 dans le forum G�n�ral Java
    R�ponses: 3
    Dernier message: 15/05/2007, 12h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo