如何有效地比较两个巨大的文件csv与更少的时间

时间:2014-03-21 12:00:19

标签: python linux csv

我需要比较两个大型csv文件。 但问题是我必须用file1的所有其他行迭代file2的每一行,并对不同的列进行一些计算。

我在python中尝试过的部分代码:

import csv

def getOverlap(a,b):
    return max(0, min(a[1], b[1]) - max(a[0], b[0]))


masterlist = [row for row in c2]

for hosts_row in c1:
    chr1 = hosts_row[3]
    a1 = [int(hosts_row[4]),int(hosts_row[5])]
    found = False
    for master_row in masterlist:
        if hosts_row[7] == master_row[7]:
            c3.writerow(hosts_row)

            chr2 = master_row[3]

            b1 = [int(master_row[4]),int(master_row[5])]
            if getOverlap(a1,b1) != 0 and chr1 == chr2:
                c5.writerow(hosts_row)
            else:
                c6.writerow(hosts_row)


            found = True
            break
    if not found:
        c4.writerow(hosts_row)
        found2 = False
        for master_row2 in masterlist:
            chr2 = master_row[3]
            b1 = [int(master_row[4]),int(master_row[5])]
            if getOverlap(a1,b1) != 0 and chr1 == chr2:
                c7.writerow(hosts_row)
                found2 = True
                break
        if not found2:
            c8.writerow(hosts_row)

但它需要大约5到6个小时的运行时间。有没有更快捷的方式。我有16gb ram。

2 个答案:

答案 0 :(得分:2)

重点不在于您的文件有多大,而是您的目标和算法设计问题。

  • 一点是定义differences
  • 如果在两个文件上以相同的方式排序行,则两个不同的行将具有不同的列。

所以,也许您应该首先考虑对csv文件进行排序,以便行顺序相同,然后您只需使用模块filecpmp

我意识到这个答案并没有真正添加任何代码,但它提供了一些思考材料。它只是渴望一个评论。

答案 1 :(得分:1)

在linux(ubuntu)中使用Meld应用程序逐行比较文件