我正在從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()
您應該嘗試在http://codereview.stackexchange.com/上發佈該內容。SO更多地是關於調試。 – hivert
好吧,我收到了一條我認爲是內存泄漏的Killed消息。這就是爲什麼我在這裏發佈它,看看我是否可以得到一些調試幫助。 – adwaraki