Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用python逐行比较大型文本文件_Python_Performance_Text Parsing - Fatal编程技术网

用python逐行比较大型文本文件

用python逐行比较大型文本文件,python,performance,text-parsing,Python,Performance,Text Parsing,我正在使用通用格式处理一些大型(数百万行)生物信息学数据集: chromosomeNumber locusStart locusStop sequence moreData 我有此格式的其他文件: chromosomeNumber locusStart locusStop moreData 我需要能够做的是将每种类型的文件中的一个读入内存,如果上一个文件行的locusStart位于下一个文件中任何行的开始和停止之间,则将该行打印到输出文件1。如果该行的locusStart不在底部文件中任何行

我正在使用通用格式处理一些大型(数百万行)生物信息学数据集:

chromosomeNumber locusStart locusStop sequence moreData
我有此格式的其他文件:

chromosomeNumber locusStart locusStop moreData
我需要能够做的是将每种类型的文件中的一个读入内存,如果上一个文件行的locusStart位于下一个文件中任何行的开始和停止之间,则将该行打印到输出文件1。如果该行的locusStart不在底部文件中任何行的开始和停止之间,则将其打印到输出文件2

我目前正在读取中的文件,将它们转换为键入染色体上的字典,并将相应的行作为值。然后,我将每个值行拆分为一个字符串,然后与字符串进行比较。这需要非常长的时间,我想知道是否有更有效的方法


谢谢。

似乎对于较低的文件(我假设它是第二种格式),您唯一关心的字段是“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与从较低文件构建的集合进行比较。该集合还将删除重复项,使其比使用列表快一点。

听起来您将要进行大量大于/小于的比较,因此,我认为将数据加载到字典中根本不会提高代码的速度——根据您的解释,听起来您仍然在循环遍历一个文件或另一个文件中的每个元素

您需要的是一个不同的数据结构,以便将数据加载到中并运行比较操作。请查看,我认为它可能提供了更高效地运行比较操作所需的数据结构



如果您能更准确地描述您正试图完成的任务,我们将能够帮助您开始编写代码。

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

然后,您需要按locusStart对这两个列表进行排序(拆分字符串,将locusStart转换为一个数字——看看您是否不确定如何单独按locusStart进行排序)

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

  • 虽然它也比LocoSend更大,但请扔掉上面列表的开头
  • 如果您发现它大于locusStart而小于LocusSend,请将其放在文件1中
  • 否则,将其放入文件2中

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

查看您的实际代码会有所帮助。老实说,我不明白什么是“上文件”和“下文件”之类的术语file@neurino-我想上面和下面是指OP中的代码块。至于问题,我想我应该先阅读文件2,对间隔进行排序,然后逐行运行文件1-这完全忽略了染色体数目,因此@user680895,请澄清一点?因此,每个染色体数目在两个文件中只有一行,您想只比较具有相同染色体数目的行吗?这些文件包含相同的密钥吗?我假设两个文件中的locusStart(和locusStop)都是单调递增的。locusStart始终大于前一行的locusStop,这是真的吗?