Создание хеш-таблицы при работе с большими данными - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть текстовый файл, в котором 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.Часть карты работает нормально, но часть сокращения занимает всю мою память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...