逐行比较大文本文件与python

时间:2011-03-28 20:22:51

标签: python performance text-parsing

我正在研究一些大型(数百万行)生物信息学数据集,其格式如下:

chromosomeNumber locusStart locusStop sequence moreData

我有这种格式的其他文件:

chromosomeNumber locusStart locusStop moreData

我需要做的是将每种类型的文件中的一种读入内存中,如果上部文件的一行的locusStart位于下部文件中任何行的开始和停止之间,则打印line to output file 1.如果该行的locusStart不在底部文件中任何行的开始和结束之间,则将其打印到输出文件2.

我正在阅读文件,将它们转换为染色体上的字典,并以相应的行作为值。然后我将每个值行拆分为一个字符串,然后与字符串进行比较。这需要花费相当长的时间,我想知道是否有更有效的方法来实现它。

感谢。

3 个答案:

答案 0 :(得分:0)

似乎对于较低的文件(我假设它具有第二种格式),您唯一关注的字段是“locusStart”。因为,根据您的描述,您不一定关心其他数据,您可以创建一组所有的locusStart:

locusStart_list = set()
with open(upper_file, 'r') as f:
  for line in f:
    tmp_list = line.strip().split()
    locusStart_list.add(tmp_list[1])

这将删除您对底部文件执行的所有不必要的行操作。然后,您可以轻松地将字段的locusStart与从较低文件构建的集合进行比较。该集合还将删除重复项,使其比使用列表快一点。

答案 1 :(得分:0)

听起来你要做的事情要比大于/小于比较,因此我不认为将数据加载到字典中会根本提高代码的速度 - 基于你的'我解释说,听起来你仍然在循环浏览一个文件或另一个文件中的每个元素。

您需要的是一种不同的数据结构,用于将数据加载到其中并运行比较操作。查看Python bisect module,我认为它可能提供您更有效地运行比较操作更多所需的数据结构。


如果您可以更准确地描述您想要完成的内容,我们将能够帮助您开始编写代码。

答案 2 :(得分:0)

使用染色体编号字典是一个好主意,只要您可以将这两个文件都放入内存中。

然后,您希望按locusStart对两个列表进行排序(拆分字符串,将locusStart转换为数字 - 如果您不确定如何单独对locusStart进行排序,请参阅instructions on sorting。)

现在您可以浏览您的列表:如果较低的locusStart小于第一个较高的locusStart,请将该行放在文件2中并继续执行下一个。如果较低的locusStart大于第一个上一个locusStart那么

  • 虽然它也大于locusEnd,但扔掉上面列表的开头
  • 如果您发现一个大于locusStart并且小于locusEnd的情况,请将其放在文件1中
  • 否则,请将其放入文件2

这应该用O(n^2)替换现在可能是O(n log n)算法的算法。