现在的实现是一个字典类型,拥有500万条数据,KEY是40位的Hash
做的是从里面确定某个Hash是否存在,但是这样的方法内存占用太多了
准备尝试bloomfilter替换但是感觉增加数据有点麻烦,是否有其他类似的算法可以用?
==== 另一种介绍 ===
每次拿到一个HASH在列表中寻找,如果有,则停止执行,如果没有,则将该HASH添加到列表,继续重复执行。
问题在:内存/效率
现在的实现是一个字典类型,拥有500万条数据,KEY是40位的Hash
做的是从里面确定某个Hash是否存在,但是这样的方法内存占用太多了
准备尝试bloomfilter替换但是感觉增加数据有点麻烦,是否有其他类似的算法可以用?
==== 另一种介绍 ===
每次拿到一个HASH在列表中寻找,如果有,则停止执行,如果没有,则将该HASH添加到列表,继续重复执行。
问题在:内存/效率
第一反应是用元组,但是不知道效率如何,你可以试试?
#!/usr/bin/env python3
data = {"a":1, "b":2, "c":3, "d":4, "a":5, "c":6}
data.keys()
t
应该就是一个不重复的hash key元组吧。
假设长度为500万的数据为字典source_dict
,需要判断的为列表hash_list
,那么:result = [item for item in hash_list if item in source_dict]
source_dict
是必须先载入内存的,如果闲占用内存,可以先source_dict.keys()
获取键列表,假设为source_keys
,那么:result = [item for item in hash_list if item in source_keys]
。
考虑到字典的遍历的速度为O(1),列表为O(n),而这里的数据量又为500万,因而推荐方法一。
用 bsddb 模块好了,虽然不是标准库,但也算常见的 python 模块,
bucket = bsddb.btopen(None)
或
bucket = bsddb.hashopen(dbfilename)
使用磁盘时存储对象也可以 pickle 下直接当 key
思路:python的对象机制,决定了python肯定不会像C那么省内存,一个str都会多占一部分内存
说到底,需要考虑的是架构,这年代算法几乎无需自己动刀了
3 回答3.1k 阅读✓ 已解决
2 回答1.9k 阅读✓ 已解决
2 回答1.3k 阅读✓ 已解决
2 回答1.8k 阅读✓ 已解决
4 回答1.9k 阅读
3 回答1.7k 阅读
1 回答1.4k 阅读✓ 已解决
因为hash 40位,是16进制数的,我将字母替换为数字,然后转化为数字来存,这样应该可以省内存,效率应该会比较O(n)低。
我的代码:
或者可以考虑用字典树来做,用C++来做最好不过了,效率和内存但可以提高!