2017-07-28 82 views
2

我試圖保留大量元組集合的頂部k個元素的列表。由於將它保存在內存中是不可能的,因此我想使用固定大小的列表來僅保留最高k值(使用鍵)。我試圖使用min堆,但python的堆非常糟糕,因爲它允許插入非唯一鍵。這是一個巨大的問題。所以我想我可以使用排序列表/代詞(帶有唯一鍵的元組)。使用草圖函數我檢索子字符串在整個文本中出現的計數(O(1)time))。我開始認爲我在循環或彈出窗口和賦值方面做了一些錯誤,因爲minheap也有類似的問題,其中只有頂部k出現在25大小的列表中,其餘的都是相當低的數量(當它處於實際上更高)在排序的固定大小列表中運行頂部k個元素/ 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

很難解決你的問題,因爲它不是很清楚。您的代碼引用代碼外部的變量'sketch'和'topkmerdict'。請仔細閱讀[mcve]並相應編輯問題。具有適當的輸入以及預期和實際輸出將有助於您和其他人調試您的問題。我知道你說你閱讀的內容比內存中的內容多,但你應該可以用較小的數據集來測試算法。將最小數據集傳遞給我們,並輸出預期結果,然後我們可以幫助您解決問題。 –

+0

@ScottMermelstein謝謝,我已編輯添加示例文件,文件讀取代碼部分並更改了草圖函數以返回一個隨機數,該函數的作用類似(返回int數)。 – dusa

+0

你看了heapq它可能會做你需要的一切嗎? – paddyg

回答

1

。請嘗試更改行:

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

到:

kmerMin = (sorted(topkmerdict,reverse = False) 

前一行只選對字符串鍵v的第二個字符alues。

相關問題