我在一台 Linux 机器(Redhat)上,并且有一个 11GB 的文本文件。文本文件中的每一行包含单个记录的数据,并且该行的前 n 个字符包含该记录的唯一标识符。该文件包含略多于 2700 万条记录。
我需要验证文件中不存在具有相同唯一标识符的多个记录。我还需要在 80GB 文本文件上执行此过程,因此任何需要将整个文件加载到内存中的解决方案都是不切实际的。
逐行读取文件,这样您就不必将其全部加载到内存中。
为每一行(记录)创建一个 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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)