我正在研究一些大型(数百万行)生物信息学数据集,其格式如下:
chromosomeNumber locusStart locusStop sequence moreData
我有其他这种格式的文件:
^{pr2}$我需要做的是将每种类型的文件读入内存,如果上层文件的某一行的开始和结束在下面文件中任何一行的开始和结束之间,则将该行打印到输出文件1。如果该行的ocasstart不在底部文件中任何行的开始和结束之间,则将其打印到输出文件2。在
我目前正在读取这些文件,将它们转换成以染色体为键控的字典,并将相应的行作为值。然后将每个值行拆分为一个字符串,然后与字符串进行比较。这需要花费相当长的时间,我想知道是否有更有效的方法来做到这一点。在
谢谢。在
使用染色体数目字典是个好主意,只要你能把两个文件都放入内存。在
然后,您需要按rocasstart对这两个列表进行排序(拆分字符串,将rocasstart转换为一个数字,如果您不确定如何单独在iocsstart上排序,请参见instructions on sorting)。在
现在,您只需浏览一下您的列表:如果较低的roacsstart小于第一个upper rocasstart,请将该行放入文件2中,然后转到下一个。如果较低的蝗虫起点大于第一个较高的蝗虫起点,则
这应该用
O(n log n)
算法取代现在可能的O(n^2)
算法。在听起来你会做很多大于/小于的比较,因此我不认为将数据加载到字典中根本不会提高代码的速度(基于你所解释的),听起来你仍然在循环使用一个或另一个文件中的每个元素。在
您需要的是一个不同的数据结构,用于将数据加载到其中并运行比较操作。看看Python ^{} module ,我认为它可能提供了更有效地运行比较操作所需的数据结构。在
如果你能更精确地描述你到底想完成什么,我们就能帮助你开始编写你的代码。在
似乎对于较低的文件(我假设它是第二种格式),您唯一关心的字段是“ocasstart”。因为,根据您的描述,您不一定关心其他数据,所以您可以创建一组所有的ocasstart:
这将删除对底部文件所做的所有不必要的行操作。然后,您可以轻松地将字段的ocassstart与从下面的文件构建的集进行比较。集合还可以删除重复项,使其比使用列表快一点。在
相关问题 更多 >
编程相关推荐