2017-07-28 1 views
2

J'essaie de conserver une liste des éléments k les plus élevés d'un grand ensemble de tuples. Puisque le garder en mémoire est impossible, je veux utiliser une liste de taille fixe pour ne conserver que les valeurs k supérieures (avec les touches). J'ai essayé d'utiliser min heap mais le tas de python est terrible car il permet d'insérer des clés non uniques. C'est un énorme problème. J'ai donc pensé que je pouvais utiliser une liste/dict triée à la place (tuples avec des clés uniques). En utilisant la fonction d'esquisse, je récupère le nombre de comptes que la sous-chaîne est apparue dans tout le texte (O (1) temps)). Je commence à penser que je fais quelque chose de mal avec les boucles ou pops et assignations, parce que le minheap a aussi un problème similaire où seul le k supérieur apparaît dans la liste des 25 tailles, et le reste est plutôt bas (quand il est en fait plus)Exécution de k éléments supérieurs dans une liste triée de taille fixe/python

for line in lines[1::4]: 

    startIdx = 0 
    while startIdx + k <= (len(line)-k): 
     kmer = line[startIdx:(startIdx+k)] 
     count = randint(1, 250) 

     if count > 2: 
      if len(tdict.keys()) < topcount: 
       tdict[km] = count 
      else: 
       kMin = (sorted(tdict,reverse = False, key=lambda x: x[1])) 
       if count > tdict[kMin[0]]: 
        topkmerdict.pop(kMin[0]) 
        topkmerdict[km] = count 
     startIdx += 1 

    linesProcessed += 1 
+0

Il est difficile de résoudre votre problème, car il n'est pas tout à fait clair. Votre code fait référence aux variables 'sketch' et' topkmerdict' qui sont externes au code. S'il vous plaît lisez en écrivant un [mcve] et éditez la question en conséquence. Avoir les entrées appropriées et les sorties attendues et réelles aiderait à la fois vous et tout le monde à déboguer votre problème. Je sais que vous avez dit que vous lisez plus que vous ne pouvez garder en mémoire, mais vous devriez pouvoir tester l'algorithme avec un jeu de données plus petit. Transmettez-nous ce jeu de données minimal, avec les résultats attendus, puis nous pouvons vous aider à résoudre votre problème. –

+0

@ScottMermelstein Merci, j'ai édité pour ajouter un fichier d'exemple, le fichier a lu des parties du code et a changé la fonction d'esquisse pour retourner un nombre aléatoire dont la fonctionnalité agit de manière similaire (renvoie count dans int). – dusa

+0

avez-vous regardé heapq il pourrait faire tout ce dont vous avez besoin? – paddyg

Répondre

1

S'il vous plaît essayez de changer la ligne:

kmerMin = (sorted(topkmerdict,reverse = False, key=lambda x: x[1])) 

à:

kmerMin = (sorted(topkmerdict,reverse = False) 

la ligne précédente est que le tri sur le deuxième caractère de la clé chaîne v alues.