我正在使用 Biopython 決議器處理氨基酸序列,但無論資料格式如何(格式是 fasta,也就是說,您可以將它們想象成如下以 id 開頭的字母串),我的問題是我有一個巨大的資料量,盡管嘗試與 joblib 并行化,但我運行這個簡單代碼所需的時間估計為 400。
基本上我有一個包含一系列 id 的檔案,我必須從原始資料集 (original_dataset) 中洗掉 (ids_to_drop),以創建一個新檔案 (new_dataset),其中包含原始資料集中包含的所有 id,而沒有 ids_to_drop。
我已經嘗試了所有這些,但我不知道還能怎么做,而且我現在被卡住了。非常感謝!
def file_without_ids_to_remove(seq):
with open(new_output, "a") as f, open(ids_to_drop, "r") as r: #output #removing file
remove = r.read().split("\n")
if seq.id not in remove:
SeqIO.write(seq, f, "fasta")
Parallel(n_jobs=10)(delayed(file_without_ids_to_remove)(seq) for seq in tqdm.tqdm(SeqIO.parse(original_dataset, 'fasta')))
需要明確的是,這是一個資料示例(sequence.id 序列):
WP_051064487.1 MSSAAQTPEATSDVSDANAKQAEALRVASVNVNGIRASYRKGMAEWLAPRQVDILCLQEVRAPDEVVDGF LADDWHIVHAEAEAKGRAGVLIASRKDSLAPDATRIGIGEEYFATAGRWVEADYTIGENAKKLTVISAYV HSGEVGTQRQEDKYRFLDTMLERMAELAEQSDYALIVGDLNVGHTELDIKNWKGNVKNAGFLPEERAYFD KFFGGGDTPGGLGWKDVQRELAGPVNGPYTWWSQRGQAFDNDTGWRIDYHMATPELFARAGNAVVDRAPS YAERWSDHAPLLVDYTIR
更新:我在建議之后嘗試了以下方式并且它有效。
with open(new_dataset, "w") as filtered:
[SeqIO.write(seq,filtered,"fasta") for seq in tqdm.tqdm(SeqIO.parse(original_dataset, 'fasta')) if seq.id not in ids_to_remove]
uj5u.com熱心網友回復:
這看起來像一個簡單的檔案過濾操作。將要洗掉的 id 一次性轉換為一組,然后讀取/過濾/寫入原始資料集。集合針對快速查找進行了優化。此操作將受 I/O 限制并且不會從并行化中受益。
with open("ids-to-remove") as f:
ids_to_remove = {seq_id_line.strip() for seq_id_line in f}
# just in case there are blank lines
if "" in ids_to_remove:
ids_to_remove.remove("")
with open("original-data-set") as orig, open("filtered-data-set", "w") as filtered:
filtered.writelines(line for line in orig if line.split()[0] not in ids_to_remove)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/400835.html
