【发布时间】:2011-05-24 09:20:33
【问题描述】:
我经常用这样的方式跟踪重复:
processed = set()
for big_string in strings_generator:
if big_string not in processed:
processed.add(big_string)
process(big_string)
我正在处理大量数据,因此不想将处理后的集合保存在内存中。我有一个使用 sqlite 将数据存储在磁盘上的版本,但是这个过程运行速度要慢得多。
要减少内存使用你认为使用这样的哈希是什么:
processed = set()
for big_string in string_generator:
key = hash(big_string)
if key not in ignored:
processed.add(key)
process(big_string)
缺点是我可能会因偶尔的哈希冲突而丢失数据。 10 亿次哈希中的 1 次碰撞对我来说不是问题。
我尝试了 md5 哈希,但发现生成哈希成为一个瓶颈。
你会建议什么?
【问题讨论】:
-
嗯,你知道你的选择。要么让对象保持活动状态,这样它就可以告诉
set,如果当前项目确实是它本身,或者只是产生相同的散列,或者你将这些对象截断为散列并获得不可恢复的散列冲突。如果不了解对象的内部结构,就无法避免这种情况。 -
如果你使用 md5,碰撞可以忽略不计(比宇宙射线造成的内存故障小)。
-
+1 对 Paulo:使用任何现代哈希,在您可能遇到偶然的哈希冲突之前,您的集合的内存就会用完。
-
我发现计算 md5 哈希会增加太多开销 - 您会推荐什么替代方案?