2017-07-24 1 views
0

J'ai une carte structurée comme carte [chaîne] [] chaîne. Maintenant, je dois trouver toutes les clés qui ont les valeurs requises dans la tranche de valeur. Je peux faire quelque chose comme ceci:go carte de recherche en utilisant des valeurs dans une carte

// allsvc is map[string][]string 
var newsl []string 


    for k, v := range allsvc { 
     for _, val := range v { 
      if v == "type1" || v == "type2" { 
       newsl.append(k) 
      } 
     } 

    } 

La carte allsvc a atleast un demi-million d'entrées à un moment donné, et la recherche est assez fréquent. Je reçois la carte allsvc comme sortie d'une bibliothèque tierce et ensuite je dois la rechercher en utilisant les valeurs de mon API et fournir une réponse. Compte tenu de la fréquence élevée de recherche qui n'utilise pas les clés mais avec des valeurs, la façon dont je l'ai fait rend mon temps de réponse api dans les secondes. Yat-il un moyen d'améliorer les performances (vitesse de recherche)?

+0

Comment est souvent la carte mise à jour? Obtenez-vous la carte une fois et devez ensuite interroger plusieurs fois? Si c'est le cas, il peut être utile de réarranger la carte quand vous l'obtenez pour ensuite accélérer les requêtes. – eugenioy

+0

Je doute que vos valeurs soient uniques? si c'est par hasard alors créez 'map [string] bool' en utilisant des valeurs (peut être vous pouvez avoir une carte par partie). BTW 'val' de deuxième' for' n'est pas utilisé dans votre extrait. – jeevatkm

+0

@eugenioy pouvez-vous donner un aperçu de la «réorganisation de la carte»? – jeevatkm

Répondre

2

Si vous interrogez cette carte plusieurs fois, il peut être utile de passer du temps à la réorganiser lorsque vous l'obtenez afin de pouvoir l'interroger plus rapidement.

Il semble que vous deviez inverser les relations, en faisant les valeurs dans allsvc les clés de la nouvelle carte, et en ayant les clés en tant que valeurs pour que vous puissiez ensuite faire des recherches dans la nouvelle carte.

Cela peut être un moyen de réorganiser la carte:

func arrangeMap(oldMap map[string][]string) map[string][]string { 
    newMap := make(map[string][]string) 
    for k, v := range oldMap { 
     for _, val := range v { 
      newMap[val] = append(newMap[val], k) 
     } 
    } 
    return newMap 
} 

Voir ici un terrain de jeu montrant l'idée:

https://play.golang.org/p/0ThZlX9xUn

+0

Merci de donner un exemple. – jeevatkm