我有一个文本文件,其中包含110,000,000行密码(2.5 gig)。任务是提出一个哈希函数,以创建最小的冲突。该文件已具有1000万个重复项(定义:具有相似哈希值(AABB = BBAA)的相似密码)。
我想出了这段代码,但是我无法运行它。我的电脑有8 GB的Ram。
这是我的代码:
data = 110000000
hash_table_size = int((30*data))/100)
hash_table = {i:[] for i in range(hash_table_size)}
with open('passwords2.txt') as file:
sum_ = 0
k = 3000
index_ = 0
for password in tqdm(file):
password = ''.join(sorted(password))
for character in password:
ascii_value = ord(character)
sum_ += (ascii_value + k)*i
index_ = sum%hash_table_size
hash_table[index_] = password
这计算了碰撞次数
length_ = 0
for i in range(hash_table_size):
if len(hash_table[i]) !=1
length_ += len(hash_table[i])
我试图在Windows上的pycharm中运行此代码,但是我的系统变得非常缓慢,无法再使用它了。我还尝试在装有4 gig Ram的虚拟机上的ubuntu上运行它,再次没有响应。
我不知道如何改进此代码。我的第一个策略是使用with open() as file:
,所以我不会一次将所有内容读到内存中。但是稍后我需要创建一个hash_table,尽管我仅获得30%的行作为我的大小,但同样会出现内存问题。我有什么建议吗?
我很感激。
P.s。我也用pyspark尝试过。地图部分工作正常,但缩小部分占用了我所有的内存。