我是一个新手Python程序员,写了一个(可能非常丑陋)的脚本,用于从fastq文件中随机选择一组序列。一个fastq文件将信息存储在每个块中的四行中。每个块中的第一行以字符“@”开头。我使用的输入文件是36GB的fastq文件,包含大约14,000,000行。
我试图重新编写一个已经存在的脚本,该脚本使用了太多的内存,我成功地减少了内存使用量。但是脚本运行起来需要很长时间,我不知道原因在哪里。
我试图重新编写一个已经存在的脚本,该脚本使用了太多的内存,我成功地减少了内存使用量。但是脚本运行起来需要很长时间,我不知道原因在哪里。
parser = argparse.ArgumentParser()
parser.add_argument("infile", type = str, help = "The name of the fastq input file.", default = sys.stdin)
parser.add_argument("outputfile", type = str, help = "Name of the output file.")
parser.add_argument("-n", help="Number of sequences to sample", default=1)
args = parser.parse_args()
def sample():
linesamples = []
infile = open(args.infile, 'r')
outputfile = open(args.outputfile, 'w')
# count the number of fastq "chunks" in the input file:
seqs = subprocess.check_output(["grep", "-c", "@", str(args.infile)])
# randomly select n fastq "chunks":
seqsamples = random.sample(xrange(0,int(seqs)), int(args.n))
# make a list of the lines that are to be fetched from the fastq file:
for i in seqsamples:
linesamples.append(int(4*i+0))
linesamples.append(int(4*i+1))
linesamples.append(int(4*i+2))
linesamples.append(int(4*i+3))
# fetch lines from input file and write them to output file.
for i, line in enumerate(infile):
if i in linesamples:
outputfile.write(line)
grep步骤实际上需要极少的时间,但是经过500多分钟后,脚本仍然没有开始写入输出文件。因此我认为是在grep和最后的for循环之间的某个步骤需要这么长的时间。但我不知道具体是哪一步,以及我可以采取什么措施来加速。
int
。此外,使用with
语句。 - Veedrac