解析python 2.7中的巨大结构化文件

时间:2014-06-27 14:23:55

标签: python parsing structured-data

我是蟒蛇世界和生物信息学的新手。我正在处理一个差不多50GB的结构化文件来写出来。所以我想向您提供一些很好的建议。

文件是这样的。 (它实际上称为FASTQ_format)

@Machinename:~:Team1:atcatg   1st line.
atatgacatgacatgaca            2nd line.       
+                             3rd line.           
asldjfwe!@#$#%$               4th line. 

这四行按顺序重复。这4条线就像一个团队。 我有近30个候选DNA序列。例如atgcattttagc

我正在做的是让每个候选DNA序列通过庞大的文件来查找候选序列是否与团队dna序列相似,这意味着允许每个不匹配(例如taaaaa = {{1}如果它们相似或相同,我使用字典存储它们以便稍后写出来。候选DNA序列的关键。 List中(4行)的值,按行顺序存储它们

所以我所做的是:

aaaata

我的函数不使用任何全局变量(我认为我对我的函数感到满意),而字典变量是一个全局变量,它接收所有数据以及制作大量列表实例。代码很简单,但速度很慢,CPU和内存对接这么大的痛苦。我虽然使用了pypy。

所以任何提示都按行顺序写出来?

1 个答案:

答案 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()以减少内存数据的总大小。