逐行读取文件,因此您不必将其全部加载到内存中。
除非您的标识符较短,否则为每一行(记录)创建一个 sha256 哈希(32 字节)。
将散列/标识符存储在numpy.array. 这可能是最紧凑的存储方式。2700 万条记录乘以 32 字节/哈希为 864 MB。这应该适合这些天像样的机器的记忆。
为了加快访问速度,您可以使用散列的前例如 2 个字节作为 a 的键,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)
Run Code Online (Sandbox Code Playgroud)