我正在研究一些大型(数百万行)生物信息学数据集,其格式如下:
chromosomeNumber locusStart locusStop sequence moreData
我有这种格式的其他文件:
chromosomeNumber locusStart locusStop moreData
我需要做的是将每种类型的文件中的一种读入内存中,如果上部文件的一行的locusStart位于下部文件中任何行的开始和停止之间,则打印line to output file 1.如果该行的locusStart不在底部文件中任何行的开始和结束之间,则将其打印到输出文件2.
我正在阅读文件,将它们转换为染色体上的字典,并以相应的行作为值。然后我将每个值行拆分为一个字符串,然后与字符串进行比较。这需要花费相当长的时间,我想知道是否有更有效的方法来实现它。
感谢。
答案 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那么
这应该用O(n^2)
替换现在可能是O(n log n)
算法的算法。