2014-02-13 37 views
0

我正在從sqlite數據庫中檢索信息,該信息讓我回到需要處理的2000萬行左右。然後將這些信息轉換成我需要使用的列表字典。我儘可能使用發生器。用於處理大型結果集的生成器

有人可以看看這段代碼,並建議優化嗎?我要麼收到「Killed」消息,要麼運行很長時間。 SQL結果集部分工作正常。我在Python解釋器中測試了生成器代碼,並沒有任何問題。我猜測問題是與字典一代。爲清楚起見

編輯/ UPDATE:

我有我的結果從我的SQLite數據庫集20萬行。每一行的形式爲:

(2786972, 486255.0, 4125992.0, 'AACAGA', '2005’) 

我現在需要創建一個鍵與該行的第四個元素「AACAGA」的字典。字典將保存的值是第三個元素,但它必須保存結果集中所有事件的值。因此,在我們的例子中,'AACAGA'將包含一個包含來自sql結果集的多個值的列表。這裏的問題是找到基因組序列中的串聯重複序列。串聯重複是連續重複至少三次的基因組閱讀('AACAGA')。對於我來計算這個,我需要第三個索引中的所有值作爲基因組讀取關鍵字列表,在我們的例子中是'AACAGA'。一旦我有了列表,我可以減去列表中的連續值,以查看是否有三次連續匹配的讀取長度。這是我的目標是用字典和列表作爲價值來完成。

#!/usr/bin/python3.3 
import sqlite3 as sql 

sequence_dict = {} 
tandem_repeat = {} 

def dict_generator(large_dict): 
    dkeys = large_dict.keys() 
    for k in dkeys: 
     yield(k, large_dict[k]) 

def create_result_generator(): 
    conn = sql.connect('sequences_mt_test.sqlite', timeout=20) 
    c = conn.cursor() 
    try: 
     conn.row_factory = sql.Row 
     sql_string = "select * from sequence_info where kmer_length > 2" 
     c.execute(sql_string) 
    except sql.Error as error: 
     print("Error retrieving information from the database : ", error.args[0]) 
    result_set = c.fetchall() 
    if result_set: 
     conn.close() 
     return(row for row in result_set) 

def find_longest_tandem_repeat(): 
    sortList = [] 
    for entry in create_result_generator(): 
     sequence_dict.setdefault(entry[3], []).append(entry[2]) 

    for key,value in dict_generator(sequence_dict): 
     sortList = sorted(value) 
     for i in range (0, (len(sortList)-1)): 
      if((sortList[i+1]-sortList[i]) == (sortList[i+2]-sortList[i+1]) 
       == (sortList[i+3]-sortList[i+2]) == (len(key))): 
        tandem_repeat[key] = True 
        break 

    print(max(k for k, v in tandem_repeat.items() if v)) 

if __name__ == "__main__": 
    find_longest_tandem_repeat() 
+0

您應該嘗試在http://codereview.stackexchange.com/上發佈該內容。SO更多地是關於調試。 – hivert

+0

好吧,我收到了一條我認爲是內存泄漏的Killed消息。這就是爲什麼我在這裏發佈它,看看我是否可以得到一些調試幫助。 – adwaraki

回答

0

作爲@hivert建議,我在codereview上獲得了一些幫助。謝謝。這在SQL中更好解決,而不僅僅是代碼。我是SQL新手,因此無法編寫複雜的查詢。有人幫我解決了這個問題。

SELECT * 
    FROM sequence_info AS middle 
     JOIN sequence_info AS preceding 
      ON preceding.sequence_info = middle.sequence_info 
      AND preceding.sequence_offset = middle.sequence_offset - 
       length(middle.sequence_info) 
     JOIN sequence_info AS following 
      ON following.sequence_info = middle.sequence_info 
      AND following.sequence_offset = middle.sequence_offset + 
       length(middle.sequence_info) 
    WHERE middle.kmer_length > 2 
    ORDER BY length(middle.sequence_info) DESC, middle.sequence_info, 
     middle.sequence_offset; 

希望這可以幫助一個人有大約相同的想法。 Here是codereview.stackexchange.com上的主題的鏈接