python – 在大文本文件中查找重复记录

我在Linux机器(Redhat)上,我有一个11GB的文本文件.文本文件中的每一行都包含单个记录的数据,该行的前n个字符包含记录的唯一标识符.该文件包含超过2700万条记录.

我需要验证文件中没有多个具有相同唯一标识符的记录.我还需要在80GB的文本文件上执行此过程,因此任何需要将整个文件加载到内存中的解决方案都不实用.

解决方法:

逐行读取文件,因此您不必将其全部加载到内存中.

对于每一行(记录),创建一个sha256哈希(32字节),除非您的标识符更短.

将哈希/标识符存储在numpy.array中.这可能是存储它们最紧凑的方式. 2700万条记录时间32字节/散列是864 MB.这应该适合现在体面的机器的记忆.

为了加快访问速度,您可以使用第一个例如将2个字节的散列作为collections.defaultdict的键,并将其余的散列放入值的列表中.这实际上会创建一个包含65536个桶的哈希表.对于27e6记录,每个桶平均包含大约400个条目的列表.
这意味着比numpy数组更快的搜索,但它会使用更多的内存.

d = collections.defaultdict(list)
with open('bigdata.txt', 'r') as datafile:
    for line in datafile:
        id = hashlib.sha256(line).digest()
        # Or id = line[:n]
        k = id[0:2]
        v = id[2:]
        if v in d[k]:
            print "double found:", id
        else:
            d[k].append(v)

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...