You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 12:15:35