0

fastqファイルからPHREDスコアを取得し、それらをすべて1つのリストに入れてから、そのリストを別の関数に渡すコードを作成しました。それはそのように見えます:

def PHRED_get():
    temp_scores = []
    all_scores = []
    fastq_location
    print("Building PHRED score bins...")
    for seq_record in SeqIO.parse(fastq_location, "fastq"):
        temp_scores = seq_record.letter_annotations
        temp_scores = temp_scores['phred_quality']
        all_scores.append(temp_scores)
    all_scores = list(itertools.chain(*all_scores))
    score_bin_maker(all_scores)

問題は、すべてのseq_recordsが検索され、対応するPHREDスコアが取得されるまで、このループが続くことです。RAMをより保守的にするために、一度に少数のseq_records(たとえば、100)を読み取り、それぞれの品質スコアを進行中のuberlistにポップするコードが必要です。次に、次の100個のseq_recordsから情報を取得し、ループを再度実行します。これを行う方法を理解するのに苦労しています。何か案は?

4

1 に答える 1

1

シンプル:カウンターを保持し、100に達したら、ループから抜けます。または、他の早期停止条件if len(temp_scores) > 1000: breakも機能します。

エレガント:itertools.isliceを使用して、イテレータから最初の100レコードだけを取得します。

import itertools

def PHRED_get():
    temp_scores = []
    all_scores = []
    fastq_location
    print("Building PHRED score bins...")
    for seq_record in itertools.islice(SeqIO.parse(fastq_location, "fastq"), 100):
        temp_scores = seq_record.letter_annotations
        temp_scores = temp_scores['phred_quality']
        all_scores.append(temp_scores)
    all_scores = list(itertools.chain(*all_scores))
    score_bin_maker(all_scores)
于 2013-05-09T17:26:42.657 に答える