В настоящее время у меня есть файл .h5 с таблицей в нем, состоящей из трех столбцов: текстовые столбцы из 64 символов, столбец UInt32, относящийся к источнику текста, и столбец UInt32, который является xxha sh из текст. Таблица состоит из ~ 2.5e9 строк
Я пытаюсь найти и сосчитать дубликаты каждой текстовой записи в таблице - по сути, объединить их в одну запись при подсчете экземпляров. Я попытался сделать это, проиндексировав столбец ha sh, а затем перебрав table.itersorted(hash)
, отслеживая значение ha sh и проверив наличие коллизий - очень похоже на поиск дубликата в pytable hdf5 с 500e6 строк . Я не изменял таблицу, пока просматривал ее, а записал объединенные записи в новую таблицу - я помещаю код внизу.
По сути, у меня проблема в том, что весь процесс занимает значительно слишком долго - мне потребовалось около 20 часов, чтобы добраться до итерации № 5 4e5. Однако я работаю над жестким диском, поэтому вполне возможно, что узкое место есть. Видите ли вы, как я могу улучшить свой код, или вы можете предложить другой подход? Заранее благодарю за любую помощь.
PS Я обещаю, что не делаю ничего противозаконного, это просто крупномасштабный анализ утечек паролей для моей дипломной работы бакалавра.
ref = 3 #manually checked first occuring hash, to simplify the below code
gen_cnt = 0
locs = {}
print("STARTING")
for row in table.itersorted('xhashx'):
gen_cnt += 1 #so as not to flush after every iteration
ps = row['password'].decode(encoding = 'utf-8', errors = 'ignore')
if row['xhashx'] == ref:
if ps in locs:
locs[ps][0] += 1
locs[ps][1] |= row['src']
else:
locs[ps] = [1, row['src']]
else:
for p in locs:
fill_password(new_password, locs[ps]) #simply fills in the columns, with some fairly cheap statistics procedures
new_password.append()
if (gen_cnt > 100):
gen_cnt = 0
new_table.flush()
ref = row['xhashx']```