查找包含 5000 万行的两个 1.75 GB CSV 文件之间的集合差异 (A-B)

Finding the set difference(A-B) between two 1.75 GB CSV files containing 50 million rows

我有两个文件,每个文件有 5000 万行,每个文件大小为 1.75GB。我无法将其加载到 google colab 或我的计算机中以 运行 一个 python 脚本来查找设置差异 (A-B)。当我尝试加载数据时,我的计算机和 colab notebook 崩溃了。

如何进一步提取所需信息?

如果您无法将文件加载到内存中,您可以遍历文件 B,计算每一行的哈希值并将其存储在一个 python 集合中。然后你可以迭代文件 A 的行以相同的方式计算哈希,只保留那些不存在于集合中的行。它会运行慢,但应该运行(只要不是single-line 3gb文件)。

import hashlib

b_hashes = set()
with open('fileB','rb') as fb:
    for line in fb:
        b_hashes.add(line)   # if line are short (<32 chars)
        #b_hashes.add(hashlib.md5(line).hexdigest()) #otherwise

with open('final_file.txt','wb') as f:
    with open('fileA','rb') as fa:
        for line in fa:
            if line not in b_hashes: # if lines are short
            #if hashlib.md5(line).hexdigest() not in b_hashes:  #otherwise
                f.write(line)

只需使用 while 循环并逐行加载:

file1 = open ("file1.csv")
file2 = open ("file2.csv")
last1line = False
while not last1line:
    line1 = file1.readline ()#important, readline not readlines!!
    last1line = len (line1) == 0

    last2line = False
    while not last2line:
        line2 = file2.readline ()
        last2line = len (line2) == 0
        #compare here
    file2.seek (0)

Rling 可以以极快的方式为您完成此操作,实际上是我所知道的最快的方法,如果您有足够的内存,它可以在几秒钟或更短的时间内完成。它建议将内存中的输入文件大小加倍,因此在您的情况下为 3.5gb。没有内存使用选项,它会在您的 PC 上创建一个数据库,但是这种方式很慢(呃)。

https://github.com/Cynosureprime/rling

你可以这样使用它:

./rling file1 difference.txt file2

或windows

rling.exe file1 difference.txt file2