以下のような 2 つの fastq ファイルがあります。ファイル内の各レコードは「@」で始まります。そのような 2 つのファイルについて、私の目的は、2 つのファイルに共通するレコードを抽出することです。
@IRIS:7:1:17:394#0/1
GTCAGGACAAGAAAGACAANTCCAATTNACATTATG
+IRIS:7:1:17:394#0/1
aaabaa`]baaaaa_aab]D^^`b`aYDW]abaa`^
@IRIS:7:1:17:800#0/1
GGAAACACTACTTAGGCTTATAAGATCNGGTTGCGG
+IRIS:7:1:17:800#0/1
ababbaaabaaaaa`]`ba`]`aaaaYD\\_a``XT
私はこれを試しました: 最初に、file1 と 2 で共通の読み取り ID のリストを取得します。
import sys
#('reading files and storing all lines in a list')
data1 = open(sys.argv[1]).read().splitlines()
data2 = open(sys.argv[2]).read().splitlines()
#('listing all read IDs from file1')
list1 = []
for item in data1:
if '@' in item:
list1.append(item)
#('listing all read IDs from file2')
list2 = []
for item in data2:
if '@' in item:
list2.append(item)
#('finding common reads in file1 and file2')
def intersect(a, b):
return list(set(a) & set(b))
common = intersect(list1, list2)
ここでは、メイン ファイルで共通 ID を検索し、データを新しいファイルにエクスポートします。次のコードは小さなファイルでは正常に機能しますが、大きなファイルで試してみるとコンピューターがフリーズします。「for」がメモリを使いすぎていると思います:
#('filtering read data from file1')
mod_data1 = open(sys.argv[1]).read().rstrip('\n').replace('@', ',@')
tab1 = open(sys.argv[1] + '_final', 'wt')
records1 = mod_data1.split(',')
for item in records1[1:]:
if item.replace('\n', '\t').split('\t')[0] in common:
tab1.write(item)
より大きなファイル(ファイルあたり 4000 万から 1 億レコード、各レコードは 4 行)で動作するように、上記のコードをどうすればよいか提案してください。