逐行读取文件,因此您不必将其全部加载到内存中.
对于每一行(记录),创建一个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)