2011-03-28 142 views
0

我在一些大的(几百万行)生物信息数据集工作与一般格式的大的文本文件行比较:行,用蟒蛇

chromosomeNumber locusStart locusStop sequence moreData 

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

chromosomeNumber locusStart locusStop moreData 

我需要做的是将每种文件类型中的一种读入内存,并且如果上层文件的一行的locusStart位于较低文件中任何行的开始和停止之间,则print要输出文件1的行。如果该行的locusStart不在启动和停止之间然后将其打印到输出文件2.

我正在阅读中的文件,将它们转换为键入染色体的字典并将相应的行作为值。然后我将每个值线分成一个字符串,然后与字符串进行比较。这需要很长时间,我想知道是否有更有效的方法来做到这一点。

谢谢。

+0

这将有助于看到您的实际代码 – dfb 2011-03-28 20:29:27

+0

老实说,我不明白什么是指像_upper _文件和_lower _文件 – neurino 2011-03-28 20:29:46

+0

@neurino方面 - 我觉得上下指的是代码块的OP。 至于我想我会读文件2第一,区间进行排序,然后运行文件1个一行一行的问题 - 这完全忽略了chromosomeNumber虽然如此,@ user680895,请澄清一下? – 2011-03-28 20:38:51

回答

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与从较低文件构建的集合进行比较。该集还会删除重复项,使其比使用列表快一点。

0

这听起来像你会做大于/小于比较,因为我不认为将数据加载到字典中会提高代码的速度 - 基于你已经解释过这听起来像你仍然在循环遍历一个文件或另一个文件中的每个元素。

你需要的是一个不同的数据结构来加载你的数据并运行比较操作。看看Python bisect module,我认为它可以提供更高效地运行比较操作很多所需的数据结构。


如果你能更精确地描述你要完成什么,我们就可以帮助您开始编写代码。

0

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

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

现在您可以遍历您的列表:如果较低的locusStart小于第一个上面的locusStart,则将该行放入文件2并继续下一个。如果下locusStart比第一上locusStart然后

  • 更大虽然它也比locusEnd更大,扔掉上面的列表中
  • 的开始。如果你发现它是大于locusStart和小于的情况下, locusEnd,把它放在文件1
  • 否则,将其放在文件2

这应该更换什么现在可能是一个O(n^2)算法与O(n log n)之一。