【发布时间】:2020-11-17 15:11:48
【问题描述】:
我有两个输入文件,我想将它们混合并将结果输出到第三个文件中。在下文中,我将使用一个玩具示例来解释文件的格式和所需的输出。每个文件包含重复的 4 行模式(但包含不同的序列),我只包含单个 4 行:
输入文件1:
@readheader1
ACACACACACACACACACACACACACACACACACACACACACACACACACACAC
+
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
...
输入文件2:
@readheader2
AATTAATT
+
FFFFFFFF
...
想要的输出:
@readheader1_AATTAATT
ACACACACACACACACACACACACACACACACACACACACACACACACACACAC
+
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
...
所以我想在small sequence found in the second line of every four line from the second file 上使用下划线附加first line of every four line from the first file。我只是将第一行的每四行中的第 2n、第 3 和第 4 行按原样输出到输出中。
我正在寻找可以优化以下内容的任何脚本(linux bash、python、c++ 等):
我编写了这段代码来完成这项任务,但我发现它很慢(60 GB 和 15 GB 的输入需要一天多的时间);请注意,输入文件是fastq.gz 格式,所以我使用 gzip 打开它们:
...
r1_file = gzip.open(r1_file_name, 'r') # input file 1
i1_file = gzip.open(i1_file_name, 'r') # input file 2
out_file_R1 = gzip.open('_R1_barcoded.fastq.gz', 'wb') # output file
r1_header = ''
r1_seq = ''
r1_orient = ''
r1_qual = ''
i1_seq = ''
cnt = 1
with gzip.open(r1_file_name, 'r') as r1_file:
for r1_line in r1_file:
if cnt==1:
r1_header = str.encode(r1_line.decode("ascii").split(" ")[0])
next(i1_file)
if cnt==2:
r1_seq = r1_line
i1_seq = next(i1_file)
if cnt==3:
r1_orient = r1_line
next(i1_file)
if cnt==4:
r1_qual = r1_line
next(i1_file)
out_4line = r1_header + b'_' + i1_seq + r1_seq + r1_orient + r1_qual
out_file_R1.write(out_4line)
cnt = 0
cnt += 1
i1_file.close()
out_file_R1.close()
然后我有两个输出使用 2 个数据集,我希望交错输出文件:第一个文件的 4 行,第二个文件的 4 行,第一个文件的 4 行,依此类推...
【问题讨论】:
-
您可能希望考虑使用 asyncio (docs.python.org/3/library/asyncio.html) 将代码拆分为协程。考虑到您的用例,它可能是最有效的工具。线程是您可以尝试的另一种选择,尽管如果您将线程用于这么多的 I/O,您会浪费相当多的 CPU 时间。您可能还想在处理之前解压缩文件。
标签: python linux bash performance io