Python DNA匹配程序运行卡顿后提示killed的问题求助
DNA匹配程序卡顿并提示'killed'的问题修复
问题背景
接触Python仅几天,编写了一个从命令行读取CSV和TXT文件的DNA匹配程序:
- CSV文件存储姓名及DNA最长序列数值(示例:
John,26,45,23) - TXT文件为DNA字符序列(示例:
AAGGTAAGTTTAGAATATAAAAGGTGAGTTAAATAGAATAGGTTAAAATTAAAGGAGATCAGATCAGATCAGATCTATCTATCTATCTATCTATCAGAAAAGAGTAAATAGTTAAAGAGTAAGATATTGAATTAATGGAAAATATTGTTGGGGAAAGGAGGGATAGAAGG) - 需求:将CSV转为二维列表,读取TXT内容,通过
longest_match函数获取三个STR的最长匹配值,与CSV数据比对匹配结果 - 问题:程序运行卡顿许久后提示
killed
错误分析与修复
1. CSV读取逻辑错误(内存溢出核心原因)
原代码中,csv.reader传入文件名而非文件对象,且重复追加行导致列表无限增长,耗尽内存被系统终止:
# 错误代码 with open(sys.argv[1], "r", newline = ''): dnalist = list(csv.reader(sys.argv[1])) for row_list in dnalist: dnalist.append(row_list)
修复后:
# 正确代码 dnalist = [] with open(sys.argv[1], "r", newline='') as csvfile: reader = csv.reader(csvfile) dnalist = list(reader) # 直接将所有行转为列表,无需额外追加
2. 空列表索引赋值错误
原代码中chdnalist是空列表,直接通过chdnalist[0]赋值会抛出IndexError,修复为使用append添加元素:
# 错误代码 chdnalist = [] chdnalist[0] = longest_match(sequence, subsequence)
修复后:
# 正确代码 chdnalist = [] subsequence = "AGAT" chdnalist.append(longest_match(sequence, subsequence)) subsequence = "AATG" chdnalist.append(longest_match(sequence, subsequence)) subsequence = "TATC" chdnalist.append(longest_match(sequence, subsequence))
3. 数据类型不匹配导致比对失败
CSV中的数值是字符串类型,而longest_match返回的是整数,直接比较永远不相等,需将CSV中的数值转为整数:
# 错误代码 if dnalist[i][1] == chdnalist[0] and dnalist[i][2] == chdnalist[1] and dnalist[i][3] == chdnalist[2]:
修复后:
# 正确代码 if int(dnalist[i][1]) == chdnalist[0] and int(dnalist[i][2]) == chdnalist[1] and int(dnalist[i][3]) == chdnalist[2]:
完整修复代码
import csv import sys def main(): # 检查命令行参数数量 if len(sys.argv) != 3: print("Missing Files!") sys.exit(1) # 读取CSV数据库文件 dnalist = [] with open(sys.argv[1], "r", newline='') as csvfile: reader = csv.reader(csvfile) dnalist = list(reader) # 读取DNA序列文件 with open(sys.argv[2], "r") as f: sequence = f.read() # 获取三个STR的最长匹配值 chdnalist = [] chdnalist.append(longest_match(sequence, "AGAT")) chdnalist.append(longest_match(sequence, "AATG")) chdnalist.append(longest_match(sequence, "TATC")) # 比对数据库寻找匹配(跳过表头,若CSV有表头) for row in dnalist[1:]: if int(row[1]) == chdnalist[0] and int(row[2]) == chdnalist[1] and int(row[3]) == chdnalist[2]: print(row[0]) return print("No Match") return def longest_match(sequence, subsequence): """返回sequence中subsequence的最长连续匹配次数""" longest_run = 0 subsequence_len = len(subsequence) sequence_len = len(sequence) for i in range(sequence_len): count = 0 while True: start = i + count * subsequence_len end = start + subsequence_len if end > sequence_len: break if sequence[start:end] == subsequence: count += 1 else: break longest_run = max(longest_run, count) return longest_run if __name__ == "__main__": main()
额外说明
- 如果CSV文件第一行是表头(比如
name,AGAT,AATG,TATC),比对时要从第二行开始遍历(dnalist[1:]),否则会把表头当成数据行比对 longest_match函数可以进一步优化(比如跳过不可能超过当前最长匹配的位置),但对于短序列来说,原逻辑足够运行
内容的提问来源于stack exchange,提问作者Scout_vet
相关产品推荐
相关产品推荐

