我是蟒蛇世界和生物信息学的新手。我正在处理一个差不多50GB的结构化文件来写出来。所以我想向您提供一些很好的建议。
文件是这样的。 (它实际上称为FASTQ_format)
@Machinename:~:Team1:atcatg 1st line.
atatgacatgacatgaca 2nd line.
+ 3rd line.
asldjfwe!@#$#%$ 4th line.
这四行按顺序重复。这4条线就像一个团队。
我有近30个候选DNA序列。例如atgcat
,tttagc
我正在做的是让每个候选DNA序列通过庞大的文件来查找候选序列是否与团队dna序列相似,这意味着允许每个不匹配(例如taaaaa
= {{1}如果它们相似或相同,我使用字典存储它们以便稍后写出来。候选DNA序列的关键。 List中(4行)的值,按行顺序存储它们
所以我所做的是:
aaaata
我的函数不使用任何全局变量(我认为我对我的函数感到满意),而字典变量是一个全局变量,它接收所有数据以及制作大量列表实例。代码很简单,但速度很慢,CPU和内存对接这么大的痛苦。我虽然使用了pypy。
所以任何提示都按行顺序写出来?
答案 0 :(得分:1)
我建议您同时打开输入和输出文件,并在逐步输入时写入输出。就像现在一样,你正在将50GB读入内存然后将其写出来。这既缓慢又不必要。
在PSEUDOCODE:
with open(huge file) as fin, open(hughfile+".out", 'w') as fout:
for line in f:
if "machine name" in line:
# read the following 4 lines from fin as a record
# process that record
# write the record to fout
# the input record in no longer needed -- allow to be garbage collected...
正如我所概述的那样,之前的4行记录是在遇到它们时被写入然后被处理掉的。如果您需要参考diction.keys()
以获取先前的记录,请仅将最低要求保留为set()
以减少内存数据的总大小。