У меня есть текстовый файл, в котором 110 000 000 строк паролей (2,5 гигабайта).Задача состоит в том, чтобы придумать хеш-функцию, которая создает минимальные коллизии.В файле уже есть 10M дубликатов (определение: похожие пароли с одинаковыми значениями хеша (AABB = BBAA)).
Я создал этот код, но не могу его запустить.Мой компьютер имеет 8 гигабайт оперативной памяти.
Это мой код:
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])
Я пытался запустить этот код в моем pycharm на моих окнах, но мойСистема стала настолько медленной, и я больше не мог с ней работать.Я также попытался запустить его на моем Ubuntu, установленном на виртуальной машине с 4 ГБ оперативной памяти, опять же без ответа.
Я не знаю, как улучшить этот код.Моей первой стратегией было использование with open() as file:
, поэтому я не зачитываю все в память сразу.Но позже мне нужно создать hash_table, и хотя я получаю только 30% строк в качестве моего размера, снова будут проблемы с оперативной памятью.Есть ли какой-нибудь совет, который я мог бы получить?Я ценю это.
Ps Я тоже пробовал с pyspark.Часть карты работает нормально, но часть сокращения занимает всю мою память.